在这种情况下,我有像DataFrame一样的
col1 col2
a 1
a 2
a 3
b 1
b 2
我想要的是首先分组col1
,然后汇总组col2
列,最后将sum
添加到DataFrame并获取
col1 col2 sum
a 1 6
a 2 6
a 3 6
b 1 3
b 2 3
答案 0 :(得分:2)
使用transform
:
df['sum'] = df.groupby('col1')['col2'].transform('sum')
print (df)
col1 col2 sum
0 a 1 6
1 a 2 6
2 a 3 6
3 b 1 3
4 b 2 3
或map
汇总sum
:
df['sum'] = df['col1'].map(df.groupby('col1')['col2'].sum())
print (df)
col1 col2 sum
0 a 1 6
1 a 2 6
2 a 3 6
3 b 1 3
4 b 2 3
答案 1 :(得分:2)
选项1
transform
返回与原始对象具有相同索引的结果
我使用assign
返回带有新列的数据框副本
有关详细信息,请参阅split-apply-combine文档。
df.assign(Sum=df.groupby('col1').col2.transform('sum'))
col1 col2 Sum
0 a 1 6
1 a 2 6
2 a 3 6
3 b 1 3
4 b 2 3
选项2
对正常groupby
和sum
的结果使用join
。
df.join(df.groupby('col1').col2.sum().rename('Sum'), on='col1')
col1 col2 Sum
0 a 1 6
1 a 2 6
2 a 3 6
3 b 1 3
4 b 2 3
的创意方法
f, u = df.col1.factorize()
df.assign(Sum=np.bincount(f, df.col2).astype(df.col2.dtype)[f])
col1 col2 Sum
0 a 1 6
1 a 2 6
2 a 3 6
3 b 1 3
4 b 2 3