Pandas按品牌分组计算同分类下12个月滚动销售额方法
实现代码
你的数据已经提前按Brand、Date排序完成,直接按品牌分组后执行滚动计算即可,代码如下:
df['12m_rolling'] = df.groupby('Brand')['sales']\ .rolling(window=12, min_periods=12)\ .sum()\ .reset_index(drop=True)
逻辑说明
- 先通过
groupby('Brand')将数据按品牌拆分为独立计算单元,所有滚动计算仅在单个品牌的分组内执行,不会跨品牌取数,自然满足「新品牌首次出现后前11条记录值为NaN」的要求 - 滚动计算的参数
window=12, min_periods=12和你原有代码逻辑完全一致:窗口长度为12条记录,只有凑够12条有效数据时才返回求和结果,不足12条的位置返回NaN - 末尾的
reset_index(drop=True)用于清除分组+滚动操作生成的多层索引,保证计算结果的行顺序和原DataFrame完全匹配,避免赋值错位
特殊场景适配
如果你的数据存在品牌月度记录缺失(比如某品牌缺了某几个月的销售数据,行记录不连续),上述按行计数的滚动逻辑会出现误差,此时需要先将日期转为时间类型设为索引,使用时间维度窗口计算,代码参考:
# 适配缺月场景:按自然12个月窗口计算 df = df.set_index(pd.to_datetime(df['Date'])) df['12m_rolling'] = df.groupby('Brand')['sales']\ .rolling('365D', min_periods=12)\ .sum()\ .reset_index(drop=True) df = df.reset_index()
内容的提问来源于stack exchange,提问作者Maksim .Levin
相关产品推荐
相关产品推荐

