分组
SAC过程
SAC指的是分组操作中的split-apply-combine过程。split指基于某一些规则,将数据拆成若干组,apply是指对每一组独立地使用函数,combine指将每一组的结果组合成某一类数据结构
以解决如下问题:
- 整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
- 变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
- 过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
- 上述三种问题的综合
groupby 函数
**DataFrame.groupby(self, by=None, axis=0, level=None, as_index: bool = True, sort: bool = True, group_keys: bool =
True, squeeze: bool = False, observed: bool = False) → ‘groupby_generic.DataFrameGroupBy’**使用映射器或按一系列列对DataFrame进行分组.
by: mapping, function, label, or list of labels 用于确定分组依据的分组。如果by是函数,则在对象索引的每个值上调用它。如果by为dict或Series,则将使用Series或dict
VALUES来确定组(将Series的值首先对齐;请参见.align()方法)。如果by为ndarray,则按原样使用这些值来确定组。标签或标签列表可以按中的列传递给分组self。注意,元组被解释为(单个)键。level: int, level name, or sequence of such, default None 如果轴是MultiIndex(分层),则按一个或多个特定级别分组。
经过groupby后会生成一个groupby对象,该对象本身不会返回任何东西,只有当相应的方法被调用才会起作用
聚合、过滤和变换
1. 聚合(Aggregation)
常用聚合函数
所谓聚合就是把一堆数,变成一个标量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max都是聚合函数
同时使用多个聚合函数 AGG()方法
**DataFrame.agg(self, func, axis=0, *args, * *kwargs)**使用指定轴上的一项或多项操作来进行Agg求和
func: function, str, list or dict 功能供AGG regating数据。如果是函数,则必须在传递DataFrame或传递给DataFrame.apply时起作用。
可接受的组合为:
- 功能
- 字符串函数名称
- 功能和/或功能名称列表,例如 [np.sum, ‘mean’]
- 轴标签的字典->函数,函数名称或此类列表。
拓展用法:
利用元组进行重命名
group_m.agg([('rename_sum','sum'),('rename_mean','mean')])
指定哪些函数作用哪些列
grouped_mul.agg({'Math':['mean','max'],'Height':'var'})
使用自定义函数
grouped_single['Math'].agg(lambda x:print(x.head(),'间隔'))
带参数的聚合函数
1 | def f(s,low,high): |
2. 过滤(Filteration)
**DataFrameGroupBy.filter(self, func, dropna=True, args, * kwargs) 返回一个DataFrame的副本,该副本中不包含不满足func指定的布尔条件的组中的元素
filter 函数是用来筛选某些组的(务必记住结果是组的全体),因此传入的值应当是布尔标量
f function 应用于每个子帧的功能。应该返回True或False。
dropna 删除未通过过滤器的组。默认为真;如果为False,则评估为False的组将填充NaN
3. 变换(Transformation)
DataFrame.transform(self,func,axis = 0, args, * kwargs ) →’DataFrame’**
func: function, str, list or dict 用于转换数据的功能。如果是函数,则必须在传递DataFrame或传递给DataFrame.apply时起作用。
可接受的组合为:
- 功能
- 字符串函数名称
- 功能和/或功能名称列表,例如 [np.exp. ‘sqrt’]
- 轴标签的字典->函数,函数名称或此类列表。
apply函数
**GroupBy.apply(self, func, *args, * *kwargs)**使用fun函数并将结果组合在一起.
apply函数的灵活性很大程度来源于其返回值的多样性:
标量返回值
df.groupby('School').apply(lambda x:x.max())
列表返回值
df.groupby('School').apply(lambda x:x-x.min()).head()
数据框返回值
1 | df[['School','Math','Height']].groupby('School')\ |
- 助OrderedDict工具同时统计多个指标
1 | from collections import OrderedDict |