加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-熊猫集团然后滚动和求和得到错误的结果

发布时间:2020-12-17 17:36:31 所属栏目:Python 来源:网络整理
导读:我想对A列进行分组,然后对B列的最后3行进行求和. df = pd.DataFrame()df['A'] = [1,1,2,2]df['B'] = [1,3,4,4] 我试过了. df['sum_B_previous_3'] = df.groupby('A').B.shift(1).rolling(3,min_periods=0).sum()df A B sum_B_previous_30 1 1 0.01 1 2 1.02

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

df = pd.DataFrame()
df['A'] = [1,1,2,2]
df['B'] = [1,3,4,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行得到错误的结果?如何纠正呢?

最佳答案
您可以使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读