使用:
print (df)
Time daily-bill
0 2012-01-01 200
1 2012-01-02 300
2 2012-01-03 100
3 2012-01-04 500
4 2012-01-05 200
5 2012-01-06 300
6 2012-01-07 100
7 2012-01-08 500
8 2012-01-09 500
arr = np.where(df['Time'].dt.weekday > 4, 'Weekend','Monday-Friday')
s = pd.Series(arr)
s1 = s.ne(s.shift()).cumsum()
df = (df['daily-bill'].groupby([s1,s.rename('Time')])
.sum()
.reset_index(level=0, drop=True)
.reset_index())
print (df)
Time daily-bill
0 Weekend 200
1 Monday-Friday 1400
2 Weekend 600
3 Monday-Friday 500
解释
:
-
首先创造
Series
通过
weekday
和
numpy.where
.
-
然后再创造一个
系列
这是由
cumsum
转移的
s
通过
shift
用于区分连续值
-
总数的
sum
并通过
reset_index
具有
drop=True
细节
:
print (s)
0 Weekend
1 Monday-Friday
2 Monday-Friday
3 Monday-Friday
4 Monday-Friday
5 Monday-Friday
6 Weekend
7 Weekend
8 Monday-Friday
dtype: object
print (s1)
0 1
1 2
2 2
3 2
4 2
5 2
6 3
7 3
8 4
dtype: int32
编辑:
如果第一列输入
DataFrame
是
DatetimeIndex
:
print (df)
daily-bill
Time
2012-01-01 200
2012-01-02 300
2012-01-03 100
2012-01-04 500
2012-01-05 200
2012-01-06 300
2012-01-07 100
2012-01-08 500
2012-01-09 500
arr = np.where(df.index.weekday > 4, 'Weekend','Monday-Friday')
s = pd.Series(arr, index=df.index)
s1 = s.ne(s.shift()).cumsum()
df = (df['daily-bill'].groupby([s1,s.rename('Time')])
.sum()
.reset_index(level=0, drop=True)
.reset_index())
print (df)
Time daily-bill
0 Weekend 200
1 Monday-Friday 1400
2 Weekend 600
3 Monday-Friday 500