我想对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行得到错误的结果?该如何纠正?
答案 0 :(得分: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
答案 1 :(得分:1)
问题在于,您要应用的唯一组操作是.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