在pandas中如何每隔n行分组并求和但保持原始结构 - 问答 - 腾讯云开发者社区-腾讯云
我有一个这样的df:
d = pd.DataFrame(list(zip(list(range(1,10)), list(range(11,20)))), columns=['a', 'b'])
print(d)
a b
0 1 11
1 2 12
2 3 13
3 4 14
4 5 15
5 6 16
6 7 17
7 8 18
8 9 19
复制
我想在b列中每隔3行分组一次,并得到总和。但是,我不想将df折叠为groupby索引。我想保留原来的a列,但我想用该行所属组的和值替换b列,如下所示:
d_ = pd.DataFrame(list(zip(list(range(1,10)), [36, 36, 36, 45, 45, 45, 54, 54, 54])), columns=['a', 'b'])
print(d_)
a b
0 1 36
1 2 36
2 3 36
3 4 45
4 5 45
5 6 45
6 7 54
7 8 54
8 9 54
复制
我该怎么做呢?
原文
关注
分享
反馈
connor449提问于2020-12-02 08:07
5 个回答
高票数最新
wwnde
回答于2020-12-02 08:21已采纳
得票数 2
d=d.assign(b=d.groupby(d.index//3)['b'].transform('sum'))
a b
0 1 36
1 2 36
2 3 36
3 4 45
4 5 45
5 6 45
6 7 54
7 8 54
8 9 54
复制
收藏0
评论0
分享
反馈
原文
Alexander
修改于2020-12-02 08:26
得票数 1
如果索引是一个简单的范围,您可以在索引上使用整数除法以三的倍数进行分组,例如d.index // 3
。对于适用于任何索引的更一般的解决方案,请对范围进行分组,而不是使用列表理解,例如[n // 3 for n in range(len(d))]
。然后将列b
分配给transformed sum。
>>> d.assign(b=d.groupby([n // 3 for n in range(len(d))])['b'].transform(np.sum))
a b
0 1 36
1 2 36
2 3 36
3 4 45
4 5 45
5 6 45
6 7 54
7 8 54
8 9 54
复制
收藏0
评论0
分享
反馈
原文
piterbarg
回答于2020-12-02 08:19
得票数 1
试试这个
(d.groupby((d['a']-1)//3)
.apply(lambda df: df.assign(b=df['b'].sum()))
.reset_index(drop = True)
)
复制
产生
a b
0 1 36
1 2 36
2 3 36
3 4 45
4 5 45
5 6 45
6 7 54
7 8 54
8 9 54
复制
在这里,我们通过3s进行groupby
( by
列表看起来像[0,0,0,1,1,1,2,2,2,...]
),然后我们将函数.assign(b=df['b'].sum())
应用于每个子组,该函数用该子组中'b‘值的总和替换'b’列
收藏0
评论0
分享
反馈
原文
Zero
回答于2020-12-02 08:18
得票数 1
像这样使用transform
In [5]: d.groupby(d.index // 3).transform('sum')
Out[5]:
a b
0 6 36
1 6 36
2 6 36
3 15 45
4 15 45
5 15 45
6 24 54
7 24 54
8 24 54
复制
收藏0
评论0
分享
反馈
原文
sammywemmy
回答于2020-12-02 08:31
得票数 0
前面的解决方案将解决这个问题;这是针对一般情况,如果索引不是数字和单调的:
当在groupby中使用grouper时,无论索引的内容如何,它都会确保每3行进行一次配对。
grouper = np.repeat([0, 1, 2], len(d) // 3)
d.assign(b=d.groupby(grouper).b.transform("sum"))
a b
0 1 36
1 2 36
2 3 36
3 4 45
4 5 45
5 6 45
6 7 54
7 8 54
8 9 54
复制
收藏0
评论0
分享
反馈
原文
页面原文内容由connor449、Zero、piterbarg、Alexander、wwnde、sammywemmy提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:https://stackoverflow.com/questions/65100396复制