Pandas:按Category分组计算移动平均遇到问题求助
按'category'分组计算移动平均的正确解决方法
常见问题根源
你大概率是没在组内限定移动窗口,误用到了全局窗口,导致结果不符合预期。下面分两种常用工具给出准确实现:
Pandas实现(Python)
- 先按分组列+时间列排序,保证移动平均的时间顺序正确:
df = df.sort_values(['category', 'date'])
- 分组后调用
rolling计算组内移动平均,最后重置索引对齐结果:
# 以3期移动平均为例,min_periods=1允许开头不足3个数据时计算均值 df['rolling_mean'] = df.groupby('category')['value'].rolling(window=3, min_periods=1).mean().reset_index(level=0, drop=True)
核心是reset_index(level=0, drop=True),它会移除分组产生的层级索引,让计算结果能和原DataFrame完美匹配,避免索引错位问题。
SQL实现
用窗口函数指定分区(分组)和窗口范围:
SELECT category, date, value, -- 3期移动平均:当前行+前两行 AVG(value) OVER ( PARTITION BY category ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS rolling_mean FROM your_table;
PARTITION BY category确保只在同类别内计算,ORDER BY date保证窗口按时间顺序滑动,ROWS BETWEEN...定义了移动窗口的范围。
额外注意事项
- 窗口大小根据业务需求调整,比如改成
window=7就是7期移动平均; - 数据有缺失值时先处理(填充/删除),否则会导致移动平均结果出现NaN;
min_periods参数可以控制最少需要多少个有效数据才计算均值,避免开头出现过多空值。
内容的提问来源于stack exchange,提问作者carrot
相关产品推荐
相关产品推荐

