【发布时间】:2025-12-11 07:00:02
【问题描述】:
假设我统计了每小时的事件数,如下所示:
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] 中的方法对我来说很自然。有没有更蟒蛇的方式来实现我想要的?为什么不重采样均值计算错误?
【问题讨论】:
-
你还需要
resampledf_by_day.groupby(df_by_day.index.dayofweek)['count'].mean() -
@Wen 将您的答案添加为社区 wiki(这意味着我没有从中获得任何代表)。如果您决定发布答案,我会删除它。
-
@cᴏʟᴅsᴘᴇᴇᴅ 伙计,没关系〜我在这里帮助和获得帮助,不是为了重点〜:-)
-
@Wen 所以我在 OP 中提到的解决方法确实是出路,对吧?我仍然发现
pivot_table的行为与[#1](或groupby)的行为有点反直觉。只有我吗? -
这是一个社区维基!随意编辑;)