Pandas教程 | 超好用的Groupby用法详解

18 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:

对agg而言,会计算得到A,B,C公司对应的均值并直接返回,但对transform而言,则会对每一条数据求得相应的结果,同一组内的样本会有相同的值,组内求完均值后会按照原索引的顺序返回结果;
在这里插入图片描述

import pandas as pd
import numpy as np

'''np.random.randint(x,y,z):
        返回从低(含)到高(不含)的随机整数'''

company=["A","B","C"]

data=pd.DataFrame({
    "company":[company[x] for x in np.random.randint(0,len(company),10)],
    "salary":np.random.randint(5,50,10),
    "age":np.random.randint(15,50,10)
})

data

#### groupby的基本原理

'''DataFrameGroupBy对象'''
group = data.groupby("company")
group

list(group)

for x,y in group:
    print(y)

# 总结来说:
# groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,**在groupby之后的一系列操作(如agg、apply等),均是基于子DataFrame的操作**。理解了这点,也就基本摸清了Pandas中groupby操作的主要原理;

#### agg 聚合操作
- pandas_round函数参考:https://www.pythonf.cn/read/126948

'''Case1:针对样例数据集,求不同公司员工的平均年龄和平均薪水,可以按照下方的代码进行:
    
    data.groupby("company").agg('max').apply(lambda x: round(x))
    感觉python中的函数,并非是四舍五入;
'''

data.groupby("company").agg('mean').round({'age': 1,'salary':2})

'''针对不同的列求不同的值:计算不同公司员工的平均年龄以及薪水的中位数'''
data.groupby('company').agg({'salary':'median','age':'mean'}).round(1)

#### transform
#在上面的agg中,我们学会了如何求不同公司员工的平均薪水,如果现在需要在原数据集中新增一列avg_salary,代表员工所在的公司的平均薪水(相同公司的员工具有一样的平均薪水),该怎么实现呢?

avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()
avg_salary_dict

'''map(avg_salary_dict) ——> 实现映射'''
data['avg_salary'] = data['company'].map(avg_salary_dict)

# 方法1:
data['avg_salary'] = data['company'].map(avg_salary_dict)
data.round(2)

# 方法2:
data['avg_salary_transform'] = data.groupby('company')['salary'].transform('mean')
data

data.groupby('company')['salary'].transform('mean')

#总结:
#对agg而言,会计算得到A,B,C公司对应的均值并直接返回,但对transform而言,则会对每一条数据求得相应的结果,同一组内的样本会有相同的值,组内求完均值后会按照原索引的顺序返回结果;

#### apply
# groupby后的apply,以分组后的子DataFrame作为参数传入指定函数的,基本操作单位是**DataFrame**,而之前介绍的apply的基本操作单位是Series;

'''假设我现在需要获取各个公司年龄最大的员工的数据:'''

def get_oldest_staff(x):
    df = x.sort_values(by = 'age',ascending = True)
    return df.iloc[-1,:]

'''as_index的作用是控制聚合输出是否以组标签为索引值'''
oldest_staff = data.groupby('company',as_index = False).apply(get_oldest_staff)
oldest_staff

data.groupby('company',as_index = False).max()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值