Fork me on GitHub

Pandas分组groupby结合agg-transform

groupby结合agg和transform使用

本文介绍的是分组groupby分组之后如何使用agg和transform

模拟数据

1
2
import pandas as pd
import numpy as np
1
2
3
4
5
6
7
8
9
10
11
12
13
14
employees = ["小明","小周","小孙","小王","小张"]   # 5位员工
time = ["上半年", "下半年"]


df=pd.DataFrame({
"employees":np.random.choice(employees,10), # 在员工中重复选择10次
# 另一种写法
#"employees":[employees[x] for x in np.random.randint(0,len(employees),10)],
"time":np.random.choice(time,10),
"salary":np.random.randint(800,1000,10), # 800-1000之间的薪资选择10个数值
"score":np.random.randint(6,12,10) # 6-11的分数选择10个
})

df
employees time salary score
0 小周 上半年 873 11
1 小王 下半年 818 10
2 小王 下半年 804 6
3 小张 下半年 811 7
4 小张 上半年 955 10
5 小张 上半年 975 11
6 小明 上半年 858 9
7 小明 上半年 993 11
8 小王 上半年 841 8
9 小王 下半年 967 7

groupby+单个字段+单个聚合

求解每个人的总薪资金额:

1
2
total_salary = df.groupby("employees")["salary"].sum().reset_index()
total_salary
employees salary
0 小周 873
1 小张 2741
2 小明 1851
3 小王 3430

使用agg也能够实现上面的效果:

1
df.groupby("employees").agg({"salary":"sum"}).reset_index()
employees salary
0 小周 873
1 小张 2741
2 小明 1851
3 小王 3430
1
df.groupby("employees").agg({"salary":np.sum}).reset_index()
employees salary
0 小周 873
1 小张 2741
2 小明 1851
3 小王 3430

groupby+单个字段+多个聚合

求解每个人的总薪资金额和薪资的平均数

方法1:使用groupby+merge

1
2
mean_salary = df.groupby("employees")["salary"].mean().reset_index()
mean_salary
employees salary
0 小周 873.000000
1 小张 913.666667
2 小明 925.500000
3 小王 857.500000

然后将上面的两个结果进行组合;在合并之前为了字段的名字更加的直观,我们重命名下:

1
2
total_salary.rename(columns={"employees":"total_salary"})
mean_salary.columns = ["employees","mean_salary"]
1
2
total_mean = total_salary.merge(mean_salary)
total_mean
employees salary mean_salary
0 小周 873 873.000000
1 小张 2741 913.666667
2 小明 1851 925.500000
3 小王 3430 857.500000

方法2:使用groupby+agg

1
2
3
4
5
total_mean = df.groupby("employees")\
.agg(total_salary=("salary", "sum"),
mean_salary=("salary", "mean"))\
.reset_index()
total_mean
employees total_salary mean_salary
0 小周 873 873.000000
1 小张 2741 913.666667
2 小明 1851 925.500000
3 小王 3430 857.500000

groupby+多个字段+单个聚合

针对多个字段的同时聚合:

1
df.groupby(["employees","time"])["salary"].sum().reset_index()
employees time salary
0 小周 上半年 873
1 小张 上半年 1930
2 小张 下半年 811
3 小明 上半年 1851
4 小王 上半年 841
5 小王 下半年 2589
1
2
3
# 使用agg来实现

df.groupby(["employees","time"]).agg({"salary":"sum"}).reset_index()
employees time salary
0 小周 上半年 873
1 小张 上半年 1930
2 小张 下半年 811
3 小明 上半年 1851
4 小王 上半年 841
5 小王 下半年 2589

groupby+多个字段+多个聚合

使用的方法是:

1
agg(’新列名‘=(’原列名‘, ’统计函数/方法‘))
1
2
3
4
5
6
df.groupby(["employees","time"])\
.agg(total_salary=("salary", "sum"),
mean_salary=("salary", "mean"),
total_score=("score", "sum")
)\
.reset_index()
employees time total_salary mean_salary total_score
0 小周 上半年 873 873.0 11
1 小张 上半年 1930 965.0 21
2 小张 下半年 811 811.0 7
3 小明 上半年 1851 925.5 20
4 小王 上半年 841 841.0 8
5 小王 下半年 2589 863.0 23

groupby+transform

关于transform函数的使用请参考:Pandas高阶函数transform使用机制

一张关于transform函数的备忘录:

1
2


本文标题:Pandas分组groupby结合agg-transform

发布时间:2022年10月18日 - 23:10

原始链接:http://www.renpeter.cn/2022/10/18/Pandas%E5%88%86%E7%BB%84groupby%E7%BB%93%E5%90%88agg-transform.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea