作者:韩信子 @ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/33
本文地址:http://www.showmeai.tech/article-detail/148
申明:版权所有,转载请分割平台与作者并注明出处
当咱们提到 python 数据分析的时候,大部分状况下都会应用 Pandas 进行操作。pandas 整个系列笼罩以下内容:
- 图解 Pandas 外围操作函数大全
- 图解 Pandas 数据变换高级函数
- Pandas 数据分组与操作
一、Pandas 数据分组与操作
在咱们进行业务数据分析时,常常要对数据依据 1 个或多个字段分为不同的组(group)进行剖析解决。如电商畛域可能会依据地理位置分组,社交畛域会依据用户画像(性别、年龄)进行分组,再进行后续的剖析解决。
Pandas 中能够借助 groupby 操作对 Dataframe 分组操作,本文介绍 groupby 的基本原理及对应的 agg、transform 和 apply 办法与操作。
咱们先模仿产出 1 个 Dataframe:
import numpy as np
import pandas as pd
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)})
二、Groupby 分组及利用
2.1 分组
pandas 实现分组操作的很简略,只须要把分组的根据 (字段) 放入 groupby 中,例如上面示例代码基于 company 分组:
group = data.groupby("company")
通过 groupby 解决之后咱们会失去一个 DataFrameGroupBy 对象:
group
# 输入
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C67C072BE0>
这个生成的 DataFrameGroupBy 是什么?data 通过 groupby 解决后产生了什么?
下面返回的 Groupby 处理结果是内存地址,并不利于直观地了解,咱们能够把 group 转换成 list 的模式来看一看外部数据和整个过程:
list(group)
转换成列表的模式后,能够看到,列表由三个元组组成,每个元组中:
- 第一个元素是组别(这里是依照 company 进行分组,所以最初分为了 A,B,C)
- 第二个元素的是对应组别下的 DataFrame
总结一下,groupby 将原有的 DataFrame 依照指定的字段(这里是 company),划分为若干个分组 DataFrame。groupby 之后能够进行下一步操作,留神,在 groupby 之后的一系列操作(如 agg、apply 等),均是基于子 DataFrame 的操作。
上面咱们一起看看 groupby 之后的常见操作。
2.2 agg 聚合操作
聚合统计操作是 groupby 后最常见的操作,类比于 SQL 中咱们会对数据依照 group 做聚合,pandas 中通过 agg 来实现。聚合操作能够用来求和、均值、最大值、最小值等,下表为 Pandas 中常见的聚合操作:
例如,计算不同公司员工的平均年龄和均匀薪水,示例代码如下:
data.groupby("company").agg('mean')
或者针对不同字段做不同的计算解决,例如,要计算不同公司员工的平均年龄、薪水的中位数。能够利用字典进行聚合操作:
data.groupby('company').agg({'salary':'median','age':'mean'})
咱们对 agg 聚合过程进行图解,如下所示:
2.3 transform 变换
transform 是另外一个 pandas 分组后会应用到的办法,咱们举例来说明它的用法。
上述 agg 利用例子中,咱们计算了不同公司员工的均匀薪水,如果当初须要新增一列 avg\_salary,代表员工所在的公司的均匀薪水(雷同公司的员工具备一样的均匀薪水),咱们就能够借助 transform 来实现。
要实现上述工作,咱们须要先求得不同公司的均匀薪水,再依照员工和公司的对应关系填充到对应的地位,应用之前学到的 map 办法能够拆解实现如下:
avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()
data['avg_salary'] = data['company'].map(avg_salary_dict)
data
而 transform 办法能够帮忙咱们一行实现全过程:
data['avg_salary'] = data.groupby('company')['salary'].transform('mean')
data
上面对 groupby+transform 的过程做图解帮忙了解:
留神图中大方框,展现了 transform 和 agg 不一样的计算过程:
- agg:会计算失去 A,B,C 公司对应的均值并间接返回
- transform:会对每一条数据求得相应的后果,同一组内的样本会有雷同的值,组内求完均值后会依照原索引的程序返回后果
2.4 apply 办法
之前咱们介绍过对 Dataframe 应用 apply 进行灵便数据变换操作解决的办法,它反对传入自定义函数,实现简单数据操作。apply 除了之前介绍的用法,也能够用在 groupby 后,咱们一起来学习一下。
对于 groupby 后的 apply,实际上是以分组后的子 DataFrame 作为参数传入指定函数的,基本操作单位是 DataFrame,而之前介绍的 apply 的基本操作单位是 Series。咱们通过一个案例来了解一下。
退出咱们须要获取各个公司年龄最大的员工的数据,能够通过以下代码实现:
def get_oldest_staff(x):
df = x.sort_values(by = 'age',ascending=True)
return df.iloc[-1,:]
oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)
oldest_staff
咱们对下面的过程图解帮忙了解:
本例中的 apply 传入函数的参数由 Series 变成这里的分组 DataFrame。相比于 agg 和 transform,apply 办法领有更大的灵活性,但它的运行效率会比 agg 和 transform 慢。所以,groupby 之后怼数据做操作,优先应用 agg 和 transform,其次再思考应用 apply 进行操作。
材料与代码下载
本教程系列的代码能够在 ShowMeAI 对应的 github 中下载,可本地 python 环境运行,能迷信上网的宝宝也能够间接借助 google colab 一键运行与交互操作学习哦!
本系列教程波及的速查表能够在以下地址下载获取
- Pandas 速查表
- NumPy 速查表
- Matplotlib 速查表
- Seaborn 速查表
拓展参考资料
- Pandas 官网教程
- Pandas 中文教程
ShowMeAI 相干文章举荐
- 数据分析介绍
- 数据分析思维
- 数据分析的数学根底
- 业务认知与数据初探
- 数据荡涤与预处理
- 业务剖析与数据挖掘
- 数据分析工具地图
- 统计与数据科学计算工具库 Numpy 介绍
- Numpy 与 1 维数组操作
- Numpy 与 2 维数组操作
- Numpy 与高维数组操作
- 数据分析工具库 Pandas 介绍
- 图解 Pandas 外围操作函数大全
- 图解 Pandas 数据变换高级函数
- Pandas 数据分组与操作
- 数据可视化准则与办法
- 基于 Pandas 的数据可视化
- seaborn 工具与数据可视化
ShowMeAI 系列教程举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程