Pandas数据的分组及transform

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)
image.png
二、取分组中的一个值
groupbying = df.groupby(by="employees")
print("取其中一个值","\n",list(groupbying)[0])
image.png
三、统计每个员工的不同分数:使用的unique方法
a = df.groupby("employees").agg({"score":"unique"}).reset_index()
print("统计每个员工的不同分数:使用的unique方法","\n",a)
image.png
四、统计每位员工的不同分数个数:使用nunique方法
b = df.groupby("employees").agg({"score":"nunique"}).reset_index()
print("统计每位员工的不同分数个数:使用nunique方法","\n",b)
image.png

transform函数

需求:

我们想在数据的后面加上一列,代表的是每位员工的平均得分,数据会变成下面的样子,绿色部分就是我们的需要


image.png
transform函数的实现
df["score_mean"] = df.groupby("employees")["score"].transform("mean")  # transform后面指定需要聚合的函数
print(df)
image.png
不用transform函数的实现
avg_score = df.groupby("employees")["score"].mean().to_dict()
print(avg_score)

df["score_avg"] = df["employees"].map(avg_score)  # 每位员工和平均值进行匹配
print(df)

image.png

总结下二者的区别:
transform是在原数据基础上加新的列,agg是根据分组字段和聚合函数生成新的数据帧
transform的数据是填充到分组对象的每列上,agg只是生成了一个最终的聚合结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容