Python 熊猫-分组后将滚动总和转移到以下组
我可能做错了什么,但在对数据帧进行分组后,我试图计算滚动平均值(为了简单起见,在本例中使用sum)。在这里之前,一切都很好,但当我应用移位时,我发现值溢出到下面的组中。见下例:Python 熊猫-分组后将滚动总和转移到以下组,python,pandas,dataframe,Python,Pandas,Dataframe,我可能做错了什么,但在对数据帧进行分组后,我试图计算滚动平均值(为了简单起见,在本例中使用sum)。在这里之前,一切都很好,但当我应用移位时,我发现值溢出到下面的组中。见下例: import pandas as pd df = pd.DataFrame({'X': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'Y': [1, 2, 3, 1, 2, 3, 1, 2, 3]}) grouped_df = d
import pandas as pd
df = pd.DataFrame({'X': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'Y': [1, 2, 3, 1, 2, 3, 1, 2, 3]})
grouped_df = df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum().shift(periods=1)
print(grouped_df)
预期结果:
X
A 0 NaN
1 NaN
2 3.0
B 3 NaN
4 NaN
5 3.0
C 6 NaN
7 NaN
8 3.0
结果我实际得到:
X
A 0 NaN
1 NaN
2 3.0
B 3 5.0
4 NaN
5 3.0
C 6 5.0
7 NaN
8 3.0
您可以看到A2的结果被传递到B3,B5的结果被传递到C6。我不确定这是不是有意的行为,我做错了什么,或者熊猫身上有什么虫子
谢谢问题是
df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum()
返回一个新序列,然后当您使用shift()
链接时,您将整个序列移动,而不是在组内移动
您需要另一个groupby
在组内移动:
grouped_df = (df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum()
.groupby(level=0).shift(periods=1)
)
或者使用groupby.transform
:
grouped_df = (df.groupby('X')['Y']
.transform(lambda x: x.rolling(window=2, min_periods=2)
.sum().shift(periods=1))
)
输出:
X
A 0 NaN
1 NaN
2 3.0
B 3 NaN
4 NaN
5 3.0
C 6 NaN
7 NaN
8 3.0
Name: Y, dtype: float64