groupby的agg函數(shù)
一哲泊、數(shù)據(jù)準(zhǔn)備
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)], # 在員工中重復(fù)選擇9個人
"salary":np.random.randint(800,1000,9), # 800-1000之間的薪資選擇9個數(shù)值
"score":np.random.randint(6,11,9) # 6-11的分?jǐn)?shù)選擇9個
})
print("df","\n",df)
image.png
二、取分組中的一個值
groupbying = df.groupby(by="employees")
print("取其中一個值","\n",list(groupbying)[0])
image.png
三编矾、統(tǒng)計每個員工的不同分?jǐn)?shù):使用的unique方法
a = df.groupby("employees").agg({"score":"unique"}).reset_index()
print("統(tǒng)計每個員工的不同分?jǐn)?shù):使用的unique方法","\n",a)
image.png
四祭玉、統(tǒng)計每位員工的不同分?jǐn)?shù)個數(shù):使用nunique方法
b = df.groupby("employees").agg({"score":"nunique"}).reset_index()
print("統(tǒng)計每位員工的不同分?jǐn)?shù)個數(shù):使用nunique方法","\n",b)
image.png
transform函數(shù)
需求:
我們想在數(shù)據(jù)的后面加上一列,代表的是每位員工的平均得分钧萍,數(shù)據(jù)會變成下面的樣子褐缠,綠色部分就是我們的需要
image.png
transform函數(shù)的實現(xiàn)
df["score_mean"] = df.groupby("employees")["score"].transform("mean") # transform后面指定需要聚合的函數(shù)
print(df)
image.png
不用transform函數(shù)的實現(xiàn)
avg_score = df.groupby("employees")["score"].mean().to_dict()
print(avg_score)
df["score_avg"] = df["employees"].map(avg_score) # 每位員工和平均值進(jìn)行匹配
print(df)
image.png
總結(jié)下二者的區(qū)別:
transform是在原數(shù)據(jù)基礎(chǔ)上加新的列,agg是根據(jù)分組字段和聚合函數(shù)生成新的數(shù)據(jù)幀
transform的數(shù)據(jù)是填充到分組對象的每列上风瘦,agg只是生成了一個最終的聚合結(jié)果