Python 熊猫组然后滚动和求和得到错误的结果

Python 熊猫组然后滚动和求和得到错误的结果,python,pandas,Python,Pandas,我想对A列进行分组,然后对B列的最后3行求和 df = pd.DataFrame() df['A'] = [1, 1, 1, 1, 2, 2, 2, 2] df['B'] = [1, 2, 3, 4, 1, 2, 3, 4] 我试过了 df['sum_B_previous_3'] = df.groupby('A').B.shift(1).rolling(3, min_periods=0).sum() df A B sum_B_previous_3 0 1 1 0.

我想对A列进行分组,然后对B列的最后3行求和

df = pd.DataFrame()
df['A'] = [1, 1, 1, 1, 2, 2, 2, 2]
df['B'] = [1, 2, 3, 4, 1, 2, 3, 4]
我试过了

df['sum_B_previous_3'] = df.groupby('A').B.shift(1).rolling(3, min_periods=0).sum()
df

    A   B   sum_B_previous_3
0   1   1   0.0
1   1   2   1.0
2   1   3   3.0
3   1   4   6.0
4   2   1   5.0
5   2   2   4.0
6   2   3   3.0
7   2   4   6.0
但是我想要

    A   B   sum_B_previous_3
0   1   1   0.0
1   1   2   1.0
2   1   3   3.0
3   1   4   6.0
4   2   1   0.0
5   2   2   1.0
6   2   3   3.0
7   2   4   6.0

为什么第4行和第5行得到错误的结果?如何更正此问题?

您可以通过以下方式为每个组调用lambda函数:

另一种解决方案是再次调用
groupby

df['sum_B_previous_3'] = (df.groupby('A').B
                            .shift(1)
                            .groupby(df['A'])
                            .rolling(3, min_periods=0)
                            .sum()
                            .reset_index(level=0, drop=True))
print (df)

   A  B  sum_B_previous_3
0  1  1               0.0
1  1  2               1.0
2  1  3               2.0
3  1  4               3.0
4  2  1               0.0
5  2  2               1.0
6  2  3               2.0
7  2  4               3.0

问题是您正在应用的唯一组操作是
.shift
df.groupby('A').B.shift(1)
的结果是一个
DataFrame
,然后进行正常滚动(未分组)

这里有一个解决方案不使用
apply
,但速度较慢:

B_shift = df.groupby('A').B.shift()
df['sum_B_previous_3'] = B_shift.groupby(df.A).rolling(3, min_periods=0).sum().values

谢谢你的回答!但我有一个问题。为什么我的答案会从上一组中得到结果?@yolox-因为
df.groupby('A').B.shift(1)
返回新的
系列
.rolling(3,min\u periods=0)。sum()
使用它,就像
df['sum\u B\u previous\u 3']=df.groupby('A').B.shift(1)
df[/code>df['sum\u\u previous\u\u 3']=df[/sum\u previous\u 3'](3,最小周期=0).sum()
B_shift = df.groupby('A').B.shift()
df['sum_B_previous_3'] = B_shift.groupby(df.A).rolling(3, min_periods=0).sum().values