搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Pandas 数据分析——超好用的 Groupby 详解

[复制链接]
查看: 23|回复: 0

1万

主题

1万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45261
发表于 2020-2-14 19:33 | 显示全部楼层 |阅读模式
在一样平常的数据分析中,经常必要将数据按照某个(多个)字段别离为差此外群体(group)举行分析,如电商范围将全国的总销售额按照省份举行别离,分析各省销售额的变革情况,交际范围将用户按照画像(性别、年龄)举行细分,研讨用户的操纵情况和偏好等。在 Pandas 中,上述的数据处置赏罚操纵重要应用 groupby 完成,这篇文章就先容一下 groupby 的底子道理及对应的 agg、transform 和 apply 操纵。
PS:很多人在进修Python的进程中,常常由于遇题目打点不了大要没好的教程从而致使自己放弃,为此我整理啦从根柢的python剧本到web斥地、爬虫、django、数据挖掘等【PDF等】必要的可以进Python全栈斥地交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的题目有老司机打点哦,一路相互监视配合进步!
为了后续图解的方便,采取模拟天生的 10 个样本数据,代码和数据以下:
  1. 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)})
复制代码
companysalaryage0C43351C17252C8303A20224B10175B21406A23337C49198B830 一、Groupby 的底子道理

在 pandas 中,实现分组操纵的代码很简单,仅需一行代码,在这里,将上面的数据集依照 company 字段举行别离:
  1. In [5]: group = data.groupby("company")
复制代码
将上述代码输入 ipython 后,会获得一个 DataFrameGroupBy 工具
  1. In [6]: groupOut[6]:
复制代码
那这个天生的 DataFrameGroupBy 是啥呢?对 data 举行了 groupby 后发生了什么?ipython 所返回的成果是其内存地址,并倒霉于直观地大白,为了看看 group 内部究竟是什么,这里把 group 转换成 list 的形式来看一看:
  1. In [8]: list(group)Out[8]:[('A',   company  salary  age  3       A      20   22  6       A      23   33),  ('B',   company  salary  age  4       B      10   17  5       B      21   40  8       B       8   30),  ('C',   company  salary  age  0       C      43   35  1       C      17   25  2       C       8   30  7       C      49   19)]
复制代码
转换成列表的形式后,可以看到,列表由三个元组组成,每个元组中,第一个元素是组别(这里是依照 company 举行分组,所以末端分为了 A,B,C),第二个元素的是对应组别下的 DataFrame,全部进程可以图解以下:

Pandas 数据分析——超好用的 Groupby 详解  热点新闻
  
总结来说,groupby 的进程就是将原本的 DataFrame 依照 groupby 的字段(这里是 company),别离为几多个分组DataFrame,被分为几多个组就有几多个分组DataFrame。所以说,在 groupby 以后的一系列操纵(如 agg、apply 等),均是基于子DataFrame 的操纵。大白了这点,也就底子摸清了 Pandas 中 groupby 操纵的重要道理。下面来说讲 groupby 以后的常见操纵。
二、agg 聚合操纵

聚合操纵是 groupby 后非经常见的操纵,会写 SQL 的朋友对此应当好坏常熟悉了。聚合操纵可以用来求和、均值、最大值、最小值等,下面的表格列出了 Pandas 中常见的聚合操纵。
函数用处min最小值max最大值sum求和mean均值median中位数std标准差var方差count计数针对样例数据集,假如我想求不同公司员工的均匀年龄和均匀薪水,可以依照下方的代码举行:
  1. In [12]: data.groupby("company").agg('mean')Out[12]:         salary    agecompanyA         21.50  27.50B         13.00  29.00C         29.25  27.25
复制代码
假如想对针对差此外列求差此外值,比如要盘算不同公司员工的均匀年龄以及薪水的中位数,可以操纵字典举行聚合操纵的指定:
  1. In [17]: data.groupby('company').agg({'salary':'median','age':'mean'})Out[17]:         salary    agecompanyA          21.5  27.50B          10.0  29.00C          30.0  27.25
复制代码
agg 聚合进程可以图解以下(第二个例子为例):

Pandas 数据分析——超好用的 Groupby 详解  热点新闻
  
三、transform

transform 是一种什么数据操纵?和 agg 有什么区分呢?为了更好地大白 transform 和 agg 的不同,下面从现实的利用处景动身举行对照。
在上面的 agg 中,我们学会了怎样求不同公司员工的均匀薪水,假如现在必要在原数据会合新增一列 avg_salary,代表员工地址的公司的均匀薪水(类似公司的员工具有一样的均匀薪水),该怎样实现呢?假如依照一般的步伐来盘算,必要先求得不同公司的均匀薪水,然后依照员工和公司的对应关系加添到对应的位置,不用 transform 的话,实今世码以下:
  1. In [21]: avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()In [22]: data['avg_salary'] = data['company'].map(avg_salary_dict)In [23]: dataOut[23]:  company  salary  age  avg_salary0       C      43   35       29.251       C      17   25       29.252       C       8   30       29.253       A      20   22       21.504       B      10   17       13.005       B      21   40       13.006       A      23   33       21.507       C      49   19       29.258       B       8   30       13.00
复制代码
假如操纵 transform 的话,仅必要一行代码:
  1. In [24]: data['avg_salary'] = data.groupby('company')['salary'].transform('mean')In [25]: dataOut[25]:  company  salary  age  avg_salary0       C      43   35       29.251       C      17   25       29.252       C       8   30       29.253       A      20   22       21.504       B      10   17       13.005       B      21   40       13.006       A      23   33       21.507       C      49   19       29.258       B       8   30       13.00
复制代码
照旧以图解的方式来看看举行 groupby 后 transform 的实现进程(为了更直观展现,图中加入了 company列,现实依照上面的代码只要 salary 列):

Pandas 数据分析——超好用的 Groupby 详解  热点新闻
  
图中的风雅框是 transform 和 agg 所纷歧样的地方,对 agg 而言,会盘算获得 A,B,C 公司对应的均值并间接返回,但对 transform 而言,则会对每一条数据求得响应的成果,同一组内的样本会有类似的值,组内求完均值后会依照原索引的顺序返回成果,倘使有不大白的可以拿这张图和 agg 那张对照一下。
四、apply

apply 应当是大家的老朋友了,它相比 agg 和 transform 而言加倍灵活,可以大要传入尽情自界说的函数,实现复杂的数据操纵。在 Pandas 数据处置赏罚三板斧 ——map、apply、applymap 详解
) 中,先容了 apply 的操纵,那在 groupby 后操纵 apply 和之前所先容的有什么区分呢?
区分是有的,可是全部实现道理是底子同等的。两者的区分在于,对于 groupby 后的 apply,以分组后的子DataFrame 作为参数传入指定函数的,底子操纵单元是 DataFrame,而之前先容的 apply 的底子操纵单元是 Series。照旧以一个案例来先容 groupby 后的 apply 用法。
假定我现在必要获得各个公司年龄最大的员工的数据,该怎样实现呢?可以用以下代码实现:
  1. In [38]: def get_oldest_staff(x):    ...:     df = x.sort_values(by = 'age',ascending=True)    ...:     return df.iloc[-1,:]    ...:In [39]: oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)In [40]: oldest_staffOut[40]:  company  salary  age  0       A      23   33       1       B      21   40       2       C      43   35      
复制代码
这样便获得了每个公司年龄最大的员工的数据,全部流程图解以下:

Pandas 数据分析——超好用的 Groupby 详解  热点新闻
  
可以看到,此处的 apply 和上篇文章中所先容的感化道理底子同等,只是传入函数的参数由 Series 变成了此处的分组DataFrame。
末端,关于 apply 的操纵,这里有个小倡议,固然说 apply 具有更大的灵活性,但 apply 的运转服从会比 agg 和 transform 更慢。所以,groupby 以后能用 agg 和 transform 打点的题目照旧优先操纵这两个方式,实在打点不了了才考虑操纵 apply 举行操纵。
总结:很多人在进修Python的进程中,常常由于遇题目打点不了大要没好的教程从而致使自己放弃,为此我整理啦从根柢的python剧本到web斥地、爬虫、django、数据挖掘等【PDF等】必要的可以进Python全栈斥地交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的题目有老司机打点哦,一路相互监视配合进步
本文的翰墨及图片根源于收集加上自己的想法,仅供进修、交换操纵,不具有任何贸易用处,版权归原作者全数,若有题目请实时联系我们以作处置赏罚。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表