Pandas按id分组计算前3行滚动和新增sum列的实现方法
正确实现代码
调整计算顺序,先按id分组,再对每个分组内的val执行滚动求和即可,你的需求刚好匹配rolling窗口的默认计算逻辑:
df['sum'] = df.groupby('id')['val'].rolling(window=3, min_periods=1).sum().reset_index(drop=True)
代码说明
groupby('id')保证每个id的计算独立,新id出现自动重置计算规则rolling(window=3, min_periods=1):窗口不足3行时用现有行数计算(对应前3行累计和的需求),窗口满3行后只计算最近3行的和(对应第4行开始的滚动和需求)reset_index(drop=True)是为了把分组滚动返回的多级索引重置为普通顺序索引,和原DataFrame索引对齐,避免赋值报错
原代码错误原因
- 计算顺序错误:先执行全局滚动计算再分组累加,没有遵循「按id独立计算」的规则
- 多余的
cumsum操作会对滚动计算的结果做二次累加,最终结果完全偏离预期
内容的提问来源于stack exchange,提问作者python noob
相关产品推荐
相关产品推荐

