社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】Pandas技巧:groupby+agg/transform

机器学习初学者 • 2 年前 • 255 次点击  

公众号:尤而小屋
作者:Peter
编辑:Peter

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

模拟数据

import pandas as pd
import numpy as np
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

employeestimesalaryscore
0小周上半年87311
1小王下半年81810
2小王下半年8046
3 小张下半年8117
4小张上半年95510
5小张上半年97511
6小明上半年8589
7小明上半年99311
8小王上半年8418
9小王下半年9677

groupby+单个字段+单个聚合

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

total_salary = df.groupby("employees")["salary"].sum().reset_index()
total_salary

employeessalary
0小周873
1小张2741
2小明1851
3小王3430

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

df.groupby("employees").agg({"salary":"sum"}).reset_index()

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

employeessalary
0小周873
1小张2741
2小明1851
3小王3430

groupby+单个字段+多个聚合

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

方法1:使用groupby+merge

mean_salary = df.groupby("employees")["salary"].mean().reset_index()
mean_salary

employeessalary
0小周873.000000
1小张913.666667
2小明925.500000
3小王857.500000

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

total_salary.rename(columns={"employees":"total_salary"})
mean_salary.columns = ["employees","mean_salary"]
total_mean = total_salary.merge(mean_salary)
total_mean

employeessalarymean_salary
0小周873873.000000
1小张2741913.666667
2小明 1851925.500000
3小王3430857.500000

方法2:使用groupby+agg

total_mean = df.groupby("employees")\
            .agg(total_salary=("salary""sum"), 
                 mean_salary=("salary""mean"))\
            .reset_index()
total_mean

employeestotal_salarymean_salary
0小周873873.000000
1小张2741913.666667
2小明1851925.500000
3小王3430857.500000

groupby+多个字段+单个聚合

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

df.groupby(["employees","time"])["salary"].sum().reset_index()

employeestimesalary
0小周上半年873
1小张上半年1930
2小张下半年811
3小明上半年1851
4小王上半年841
5小王下半年2589
# 使用agg来实现

df.groupby(["employees","time"]).agg({"salary":"sum"}).reset_index()

employeestimesalary
0小周上半年873
1小张上半年1930
2小张下半年811
3小明上半年1851
4小王上半年841
5小王下半年2589

groupby+多个字段+多个聚合

使用的方法是:

agg(’新列名‘=(’原列名‘, ’统计函数/方法‘))
df.groupby(["employees","time"])\
            .agg(total_salary=("salary""sum"), 
                mean_salary=("salary""mean"),
                total_score=("score""sum"
                )\
            .reset_index()

employeestimetotal_salarymean_salarytotal_score
0小周上半年873873.011
1小张上半年1930965.021
2小张下半年811811.07
3小明上半年1851925.520
4小王上半年841841.08
5小王下半年2589863.023

groupby+transform

关于transform函数的使用请参考(建议一定要看):Pandas高阶函数transform使用机制

Pandas高级函数transform使用指南

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





    
往期 精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148782
 
255 次点击