Pandas数据框,如何按多列分组并对特定列应用求和,并添加新的计数列?

6

假设有一个数据框 df1 如下:

Col1    Col2    Col3    Col4    Col5
-------------------------------------
A       1       AA      10      Test1
A       1       AA      5       Test2
A       2       AB      30      Test3
B       4       FF      10      Test4
C       1       HH      4       Test7
C       3       GG      6       Test8
C       3       GG      7       Test9
D       1       AA      4       Test5
D       3       FF      6       Test6
  • 我想按Col1、Col2和Col3分组,并

  • 添加新列Count:每个组的大小

  • 添加新列Col4_sum:每个组中Col4的总和


需要的输出

Col1    Col2    Col3    Count   Col4_sum
----------------------------------------
A       1       AA      2       15
A       2       AB      1       30
B       4       FF      1       10
C       1       HH      1       4
C       3       GG      2       13
D       1       AA      1       4
D       3       FF      1       6

我会尝试使用。
df1.groupby(['Col1','Col2','Col3']).size 

但只获取Count列。

6个回答

9
使用元组来指定聚合函数的新列名称,可以使用GroupBy.agg
df = (df1.groupby(['Col1','Col2','Col3'])['Col4']
         .agg([('Count','size'), ('Col4_sum','sum')])
         .reset_index())
print (df)
  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6

在pandas 0.25+中,可以使用命名汇总功能:
df = (df1.groupby(['Col1','Col2','Col3'])
         .agg(Count=('Col5', 'size'), Col4_sum=('Col4', 'sum'))
         .reset_index())
print (df)
  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6

1
非常感谢。还有一个问题,我如何将自定义函数应用于Col4而不是sum函数。 - Paitoon Gunhong
如果@PaitoonGunhong等于0,则将“'sum'”更改为“custom_func”。 - jezrael

2

1

这应该可以解决你的问题。

df2 = df.groupby(['Col1','Col2','Col3'])['Col4'].agg('sum')

1
您可以使用函数pivot_table
df = pd.pivot_table(df, index=['Col1', 'Col2', 'Col3'], values='Col4', aggfunc=['count', 'sum']).reset_index()
df.columns = ['Col1', 'Col2', 'Col3', 'Count', 'Col4_sum']

输出:

  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6

0
另一个稍微啰嗦一点且还没有被提到的解决方案是使用assign函数,用法如下:
df = df1.assign(Count=df1.groupby(['Col1','Col2','Col3']).Col4.transform('size'))
        .assign(Col4_sum=df1.groupby(['Col1','Col2','Col3']).Col4.transform('sum'))
        .reset_index()

0

使用agg函数和字典,您可以定制输出,如下所示

df.groupby(['Col1','Col2','Col3']).agg({'Col3': ['count'], 'Col4': ['count','sum']})

这应该返回Col1、Col2和Col3的一个分组,同时聚合Col3的计数,然后是Col4的计数和总和


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接