详细内容可以参考:https://github.com/datawhalechina/joyful-pandas第三章内容
本文将就可能理解起来会有问题的几个内容进行介绍。
一、SAC过程
1. 内涵
SAC指的是分组操作中的split-apply-combine过程
其中split指基于某一些规则,将数据拆成若干组,apply是指对每一组独立地使用函数,combine指将每一组的结果组合成某一类数据结构
2. apply过程
在该过程中,我们实际往往会遇到四类问题:
整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
综合问题——即前面提及的三种问题的混合
二、groupby函数
1. 分组函数的基本内容:
(e)level参数(用于多级索引)和axis参数`
import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv',index_col='ID')
df.head()
df.set_index(['Gender','School']).groupby(level=0,axis=0).get_group('M').head()
# 设置'Gender','School'为新的索引,得到一个多级索引,level=0表示按Gender分组,并取出M组前5行
#可以尝试下面语句的输出
#df.set_index(['Gender','School']).groupby(level=1,axis=0).get_group('S_1').head()
2. groupby对象的特点
(b)分组对象的head和first
对分组对象使用head函数,返回的是每个组的前几行,而不是数据集前几行
grouped_single = df.groupby('School')
grouped_single.head(2)
first显示的是以分组为索引的每组的第一行信息
grouped_single.first()
#将分组的列变为索引列并显示每个分组的第一行,排列顺序按字母顺序。
(c)分组依据
对于groupby函数而言,分组的依据是非常自由的,只要是与数据框长度相同的列表即可,同时支持函数型分组`
df.groupby(np.random.choice(['a','b','c'],df.shape[0])).get_group('a').head()
#相当于将np.random.choice(['a','b','c'],df.shape[0])当做新的一列进行分组
#随机产生df.shape[0]长度的从'a','b','c'选出的ndarray数据,并取出‘a’分组的前5个值
从原理上说,我们可以看到利用函数时,传入的对象就是索引,因此根据这一特性可以做一些复杂的操作
df[:5].groupby(lambda x:print(x)).head(10)
#df中前5行数据按索引分组,相当于y以每个索引分组,无实际意义,只是看到传入的对象是索引这样的规律。
注意:为了观察传入的参数,常用上述代码中匿名函数的方式进行打印,观察传入的对象类型。
根据奇偶行分组
df.groupby(lambda x:'奇数行' if not df.index.get_loc(x)%2==1 else '偶数行').groups
#注意df.index.get_loc(x)对应的是0,1,2...的索引值,所以奇数行对应余数为0的索引,刚好相反
(e)连续型变量分组
例如利用cut函数对数学成绩分组:
bins = [0,40,60