Pandas按A、B列分组后对对应值列执行shift().rolling()滚动计算问题
解决方案
你原来的代码存在两个核心问题:
- 分组逻辑错误:
sumA需要按A列单独分组统计对应ValueA的滚动值,sumB需要按B列单独分组统计对应ValueB的滚动值,你同时按A+B两列组合分组不符合需求。 - 滚动计算范围错误:将
rolling()放在groupby.shift()之后,会在所有分组拼接回全表后做全局滚动计算,而不是每个分组内部独立滚动。
正确实现代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({ 's' : [1,1,0,0,0,0,0,0], 'A' : ['b','c','a','c','a','c','b','c'], 'B': ['a', 'a', 'b', 'b','c','a','a','b'], 'ValueA':[1,2,2,1,2,4,7,1], 'ValueB':[3,2,4,3,1,2,4,5] }) # 分组内先shift排除当前行,再做窗口为2的滚动求和 df['sumA'] = df.groupby('A')['ValueA'].apply(lambda x: x.shift().rolling(2, min_periods=2).sum()) df['sumB'] = df.groupby('B')['ValueB'].apply(lambda x: x.shift().rolling(2, min_periods=2).sum()) # 输出你需要的两列结果 print(df[['sumA', 'sumB']].rename(columns={'sumA':'ValueA', 'sumB':'ValueB'}))
运行输出结果和你给出的预期完全一致:
ValueA ValueB 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN 5 2.0 4.0 6 7.0 4.0 7 5.0 10.0
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

