Python 熊猫-分组后将滚动总和转移到以下组

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

我可能做错了什么,但在对数据帧进行分组后,我试图计算滚动平均值(为了简单起见,在本例中使用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 = 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