Pandas中groupby与rolling分组求均值结果不一致问题咨询
为什么两种分组均值方法结果不一致?
嗨,我来帮你梳理一下问题出在哪~其实核心差异是两种方法的窗口定义和取值位置不匹配,咱们一步步拆解:
1. groupby(pd.Grouper(freq='5s'))的逻辑
这种方法是严格按照时间区间来分组的:
- 你的数据从
2018-01-01 09:01:00开始,第一个分组区间是[09:01:00, 09:01:05),包含00、01、02、03、04这5个时间点的数据,计算这5个值的均值,结果的索引是区间的起始时间(00秒); - 第二个区间是
[09:01:05, 09:01:10),包含05-09秒的数据,均值对应索引05秒; - 以此类推,正好分成10组(50条数据 ÷ 5秒每组)。
2. 你用的rolling方法为啥结果不对?
rolling(window=5).mean()是滚动计算连续5个数据的均值,但你后续用iloc[::5]取数的位置错了:
- rolling的第一个有效均值出现在第5个数据点(位置4,对应04秒),这个值对应的窗口是00-04秒;
- 如果你直接用
iloc[::5],取的是位置0(NaN)、5、10...,位置5对应的窗口是01-05秒——这个窗口包含了前一组的最后4个数据(01-04)和当前组的第一个数据(05),和groupby的分组窗口完全不重合,结果自然不一样。
3. 修正后的rolling方法
只要调整取数的起始位置,就能让窗口和groupby完全匹配:
df_rolling = df.rolling(window=5).mean().iloc[4::5]
这里iloc[4::5]表示从位置4(第一个有效均值)开始,每隔5个位置取一个值,对应的窗口正好是:
- 位置4 → 00-04秒
- 位置9 → 05-09秒
- 位置14 → 10-14秒
- ...以此类推
这样计算出来的均值数值就和groupby的结果完全一致了(唯一的区别是索引:groupby的索引是区间起始时间,rolling的是窗口最后一个时间点,你可以手动修改索引对齐)。
验证一下
用代码验证数值一致性(考虑浮点计算精度,用np.allclose):
import pandas as pd import numpy as np # 生成数据 df = pd.DataFrame(np.random.randn(50,2),columns=list('AB'),index=pd.date_range('20180101 9:01:00',freq='s',periods=50)) # groupby方式 df_groupby = df.groupby(pd.Grouper(freq='5s')).mean() # 修正后的rolling方式 df_rolling = df.rolling(window=5).mean().iloc[4::5] # 对比数值 print(np.allclose(df_groupby.values, df_rolling.values)) # 输出True
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

