Pandas中groupby的这些用法你都知道吗?
导读
pandas作为Python数据分析的瑞士军刀,集成了大量实用的功能接口,基本可以实现数据分析一站式处理。前期,笔者完成了一篇pandas系统入门教程,也针对几个常用的分组统计接口进行了介绍,今天再针对groupby分组聚合操作进行拓展讲解。
01 如何理解pandas中的groupby操作
其中:
split:按照某一原则(groupby字段)进行拆分,相同属性分为一组
apply:对拆分后的各组执行相应的转换操作
combine:输出汇总转换后的各组结果
02 分组(split)——groupby
groupby首先要指定分组原则,这也是groupby函数的第一步,其常用参数包括:
by,分组字段,可以是列名/series/字典/函数,常用为列名
axis,指定切分方向,默认为0,表示沿着行切分
as_index,是否将分组列名作为输出的索引,默认为True;当设置为False时相当于加了reset_index功能
sort,与SQL中groupby操作会默认执行排序一致,该groupby也可通过sort参数指定是否对输出结果按索引排序
单列作为分组字段,不设置索引
单列字段的转换格式作为分组字段
字典,根据索引对记录进行映射分组
函数,根据函数对索引的执行结果进行分组
03 转换(apply)——agg/apply/transform
分组之后的第二个步骤即为分组转换操作,也就是应用(apply)一定的函数得到相应的结果。常用的执行操作方式有4种:
直接加聚合函数,但只能实现单一功能,常用聚合函数包括:mean/sum/median/min/max/last/first等,最为简单直接的聚合方式
agg(或aggregate),执行更为丰富的聚合功能,常用列表、字典等形式作为参数
apply,除了agg丰富的可选聚合函数外,apply还可以自定义面向分组的聚合函数
transform,又一个强大的groupby利器,其与agg和apply的区别相当于SQL中窗口函数和分组聚合的区别:transform并不对数据进行聚合输出,而只是对每一行记录提供了相应聚合结果;而后两者则是聚合后的分组输出。
实际上,pandas中几乎所有需求都存在不止一种实现方式!
04 时间序列的groupby——resample
再次指出,groupby相当于是按照某一规则对数据进行分组聚合,当分组的规则是时间序列时,还存在另一种特殊的分组方式——重采样resample。理解groupby的split-apply-combine三步走处理流程,那么自然也很容易理解resample处理流程:按照时间split——apply——combine。同时,也正因为resample是一种特殊的分组聚合,所以groupby的4种转换操作自然也都适用于resample。
当然,这是直接用了聚合函数,更复杂的例如agg、apply和transform等用法也是一样的。换句话说,resample与groupby的核心区别仅在于split阶段:前者按照时间间隔进行分组,而后者是按照定义的某种规则进行分组。
需要指出,resample等价于groupby操作一般是指下采样过程;同时,resample也支持上采样,此时需设置一定规则进行插值填充。