Pandas分组、滚动求和出现错误结果

3

我希望将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行的结果错误?如何纠正这个问题?

2个回答

1
你可以使用 GroupBy.apply 按组调用 lambda 函数:
f = lambda x: x.shift(1).rolling(3, min_periods=0).sum()
df['sum_B_previous_3'] = df.groupby('A').B.apply(f)
print (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               0.0
5  2  2               1.0
6  2  3               3.0
7  2  4               6.0

另一个解决方案是再次调用 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

谢谢回答!但我有一个问题。为什么我的答案得到了最后一组的结果? - ResidentSleeper
1
@yolox - 因为 df.groupby('A').B.shift(1) 返回新的 Series,而 .rolling(3, min_periods=0).sum() 与之一起工作,就像 df['sum_B_previous_3'] = df.groupby('A').B.shift(1) 一样。df['sum_B_previous_3'] = df['sum_B_previous_3'].rolling(3, min_periods=0).sum() - jezrael

1
问题在于你所应用的唯一组操作是.shiftdf.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接