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

Python Pandas按类别计算DataFrame12个月滚动平均值问题求助

解决方案

你出现跨分类取数的核心原因是没有先按categorie字段分组就直接调用rolling方法,pandas会默认把整个DataFrame按现有顺序连续计算,不会自动隔离不同分类的数据。

具体实现步骤

  • 第一步:先处理时间字段:如果YYYYMM为字符串格式,先转成datetime类型避免排序出错,再按categorie、YYYYMM两个字段升序排序,确保每个分类下的时间序列是连续且按时间先后排列的,避免因为时间乱序导致滚动计算结果错误。
  • 第二步:用groupby方法按categorie分组,针对每个分组内的avg(monthly)字段调用rolling方法,设置窗口为12即可。

示例代码

import pandas as pd

# 可选:字符串格式的年月转datetime,避免排序错误
df['YYYYMM'] = pd.to_datetime(df['YYYYMM'], format='%Y%m')

# 按分类+时间排序,保证每个分类下的时间序列连续有序
df_sorted = df.sort_values(by=['categorie', 'YYYYMM']).reset_index(drop=True)

# 分组计算12个月滚动平均
df_sorted['12m_rolling_avg'] = df_sorted.groupby('categorie', group_keys=False)['avg(monthly)'].rolling(window=12, min_periods=1).mean()

关键参数说明

  • group_keys=False:如果不加这个参数,分组计算后返回的Series会自带categorie作为多级索引的第一级,和原DataFrame的索引对不上会导致赋值失败,加上后可以直接匹配原排序后的DataFrame的索引。
  • min_periods=1:如果你的数据里存在分类数据不满12个月的情况,设置这个参数会用现有能取到的最大窗口数据计算平均值;如果要求必须满12个月才出结果可以删掉这个参数,不满12个月的位置会返回空值。

内容的提问来源于stack exchange,提问作者wokter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 09:39:04