You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:50