groupby的agg函数
一、数据准备
import pandas as pd
import numpy as np
employees = ["小明","小周","小孙"] # 3位员工
df=pd.DataFrame({
"employees":[employees[x] for x in np.random.randint(0,len(employees),9)], # 在员工中重复选择9个人
"salary":np.random.randint(800,1000,9), # 800-1000之间的薪资选择9个数值
"score":np.random.randint(6,11,9) # 6-11的分数选择9个
})
print("df","\n",df)
二、取分组中的一个值
groupbying = df.groupby(by="employees")
print("取其中一个值","\n",list(groupbying)[0])
三、统计每个员工的不同分数:使用的unique方法
a = df.groupby("employees").agg({"score":"unique"}).reset_index()
print("统计每个员工的不同分数:使用的unique方法","\n",a)
四、统计每位员工的不同分数个数:使用nunique方法
b = df.groupby("employees").agg({"score":"nunique"}).reset_index()
print("统计每位员工的不同分数个数:使用nunique方法","\n",b)
transform函数
需求:
我们想在数据的后面加上一列,代表的是每位员工的平均得分,数据会变成下面的样子,绿色部分就是我们的需要
transform函数的实现
df["score_mean"] = df.groupby("employees")["score"].transform("mean") # transform后面指定需要聚合的函数
print(df)
不用transform函数的实现
avg_score = df.groupby("employees")["score"].mean().to_dict()
print(avg_score)
df["score_avg"] = df["employees"].map(avg_score) # 每位员工和平均值进行匹配
print(df)
总结下二者的区别:
transform是在原数据基础上加新的列,agg是根据分组字段和聚合函数生成新的数据帧
transform的数据是填充到分组对象的每列上,agg只是生成了一个最终的聚合结果