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

作者:Peter
编辑:Peter

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

7c3ad181067b124ed788edf37e056b1c.jpeg

模拟数据

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函数的备忘录:

3f04654ab355a88c11b82cad1ec1cf7f.jpeg

7d3c03f46f5bc3aeeeee13ea29b674d6.png

推荐阅读

ead0902f46affcdaf62415ee0d83b1c6.png

【Pandas技巧】nsmallest和nlargest
Python爬虫游全国:青岛站
【特征工程】Pandas实现因子化!
特征工程:数据归一化和标准化!
Kaggle No.21:肿瘤数据统计分析!
图解Kaggle竞赛神器:LightGBM

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值