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
相关产品推荐
相关产品推荐

