的使用熊猫
问题描述:
每星期行动平均数假设我有每小时事件次数的计数如下:的使用熊猫
np.random.seed(42)
idx = pd.date_range('2017-01-01', '2017-01-14', freq='1H')
df = pd.DataFrame(np.random.choice([1,2,3,4,5,6], size=idx.shape[0]), index=idx, columns=['count'])
df.head()
Out[3]:
count
2017-01-01 00:00:00 4
2017-01-01 01:00:00 5
2017-01-01 02:00:00 3
2017-01-01 03:00:00 5
2017-01-01 04:00:00 5
如果我想知道总数的每天活动本周,我能做之一:
df.pivot_table(values='count', index=df.index.dayofweek, aggfunc='sum')
或
df.groupby(df.index.dayofweek).sum()
个这两个收益率:
Out[4]:
count
0 161
1 170
2 164
3 133
4 169
5 98
6 172
但是,如果我想计算平均每工作日事件,以下
df.pivot_table(values='count', index=df.index.dayofweek, aggfunc='mean') # [#1]
是错误!此方法使用总和(如上面计算的),并将其除以一周中每天出现的小时数。
我找到的解决方法是:
df_by_day = df.resample('1d').sum()
df_by_day.pivot_table(values='count', index=df_by_day.index.dayofweek, aggfunc='mean')
也就是说,第一重采样到几天,然后转动它。不知怎的,[#1]
的方法对我来说很自然。是否有更多的pythonic方式来实现我想要的?为什么没有重新采样均值是错误地计算的?
答
Resample first using df.resample
and then df.groupby
:
df = df.resample('1d').sum()
print(df)
count
2017-01-01 92
2017-01-02 86
2017-01-03 86
2017-01-04 90
2017-01-05 64
2017-01-06 82
2017-01-07 97
2017-01-08 80
2017-01-09 75
2017-01-10 84
2017-01-11 74
2017-01-12 69
2017-01-13 87
2017-01-14 1
out = df.groupby(df.index.dayofweek)['count'].mean()
print(out)
1 85.0
2 82.0
3 66.5
4 84.5
5 49.0
6 86.0
Name: count, dtype: float64
你仍然需要''resample' df_by_day.groupby(df_by_day.index.dayofweek) '计数']的意思是()' – Wen
@Wen增加你的答案为社区维基(这意味着我没有得到它的任何代表)。如果您决定发布答案,我会将其删除。 –
@cᴏʟᴅsᴘᴇᴇᴅ伙计,这是好的〜我在这里帮忙,并得到了帮助,而不是为了〜:-) – Wen