Pandas分组
SAC过程
- 内涵
SAC指的是分组操作中的split-apply-combine过程
其中split指基于某一些规则,将数据拆成若干组,apply是指对每一组独立地使用函数,combine指将每一组的结果组合成某一类数据结构 - apply过程
在该过程中,我们实际往往会遇到四类问题:
整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
综合问题——即前面提及的三种问题的混合
groupby函数
基本内容
可根据列分组(一列或者多列)
-组的遍历时
for name,group in grouped_single: print(name) display(group.head())
第一个参数就是name,第二个参数为group的DataFrame 如果只有一个参数就是group的DataFrame
- level参数
df.set_index(['Gender','School']).groupby(level=1,axis=0).get_group('S_1')
level 指的是多层索引,最外面的是level 0
groupby对象的特点
- 分组对象的head和first
对分组对象使用head函数,返回的是每个组的前几行,而不是数据集前几行
first显示的是以分组为索引的每组的第一个分组信息 - 对于groupby函数而言,分组的依据是非常自由的,只要是与数据框长度相同的列表即可,同时支持函数型分组
- groupby的[]操作
可以用[]选出groupby对象的某个或者某几个列
聚合、过滤和变换
聚合(Aggregation)
所谓聚合就是把一堆数,变成一个标量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max都是聚合函数
- 同时使用多个聚合函数
group_m.agg(['sum','mean','std'])
- 指定作用于哪些列
grouped_mul.agg({'Math':['mean','max'],'Height':'var'})
- 利用NamedAgg函数进行多个聚合
注意:不支持lambda函数,但是可以使用外置的def函数
过滤(Filteration)
filter函数是用来筛选某些组的(务必记住结果是组的全体),因此传入的值应当是布尔标量
变换(Transformation)
transform函数中传入的对象是组内的列,并且返回值需要与列长完全一致
apply函数
可能在所有的分组函数中,apply是应用最为广泛的,这得益于它的灵活性: