python - Pandas Group 然后滚动和求和得到错误的结果
问题描述
我想对 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.apply
:
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
推荐阅读
- javascript - 将相邻列中的标题元素最小高度设置为与最高标题一样高
- java - 如何在不使用内置函数的情况下获取 LinkedList 类的下一个指针?
- python - 如何获得与 django rest 框架中的帖子相对应的评论?
- python-3.x - 在python中创建一个大字母'A'
- r - 有什么方法可以在 Rmarkdown 中强制输出文件名?
- qt - 如何将鼠标滚轮滚动添加到垂直滚动条或滚动区域?
- html - 机器人框架:如何定位输入文本字段以及如何在其中输入值
- r - 如何从序列中排除某些数字?
- python - 为什么我的代码没有检查列表中的每个值?
- jasper-reports - Jasper:仅当至少一个表格行可以容纳时才呈现表格的标题