Python 在dataframe中,如何按多个列分组,并对特定列应用求和,以及添加新的计数列?
给定数据帧df1,如下所示:Python 在dataframe中,如何按多个列分组,并对特定列应用求和,以及添加新的计数列?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,给定数据帧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
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分组
- 添加新列计数:每个组的大小
- 添加新列Col4\u 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
但只获取计数列。与元组一起使用,以指定具有新列名称的聚合函数:
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
在熊猫中,可能使用0.25+:
您可以使用列名称和聚合函数的dict。看
另一个更详细且未提及的解决方案是使用以下选项:
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()
这应该能解决你的问题
df2 = df.groupby(['Col1','Col2','Col3'])['Col4'].agg('sum')
使用agg函数和字典,您可以像这样自定义输出
df.groupby(['Col1','Col2','Col3']).agg({'Col3': ['count'], 'Col4': ['count','sum']})
这应该为Col1、Col2和Col3返回一个组,同时聚合Col3的计数,然后是Col4的计数和总和。您可以使用以下函数:
输出:
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
非常感谢你。还有一个问题,我如何将自定义函数应用于Col4而不是sum。@PaitoonGunhong 0然后将
'sum'
更改为custom_func
@PaitoonGunhong-只接受一个答案。
df.groupby(['Col1','Col2','Col3']).agg({'Col3': ['count'], 'Col4': ['count','sum']})
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