如何根据特定列组向DataFrame添加额外的sum列?

时间:2017-08-18 07:41:45

标签: python pandas dataframe

在这种情况下,我有像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

2 个答案:

答案 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
对正常groupbysum的结果使用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

选项3
pd.factorizenp.bincount

的创意方法
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