《利用Python进行数据分析》读书笔记 第10章 数据聚合与分组运算
第10章 数据聚合与分组运算
10.1 GroupBy机制
split-apply-combine(拆分-应用-合并)。第一阶段,pandas对象(无论是Series、DataFrame还有其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行。
分组键可以有多种形式,且类型不必相同:
列表或数组,其长度与待分组的轴一样。
表示DataFrame某个列名的值。
字典或Series,给出待分组轴上的值与分组名之间的对应关系。
函数,用于处理轴索引或索引中的各个标签。
groupby的size方法返回一个含有分组大小的series。
- 对分组进行迭代
groupby默认是在axis=0上进行分组的,通过设置也可以在其他任何轴上进行分组。
- 通过字典或Series进行分组
假设已知列的分组关系,并根据分组计算列的和:
直接传递字典(包含键“f”说明,存在未使用的分组键是可以的):
Series也有相同功能,它可以被看做一个固定大小的映射:
- 通过函数进行分组
任何被当做分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。
- 根据索引级别分组
层次化索引数据集最方便的地方在于它能够根据轴索引的一个级别进行聚合:
根据级别分组,使用level关键字传递级别序号或名称:
10.2 数据聚合
聚合指的是任何能够从数组产生标量值的数据转换过程。
quantile可以计算series或dataframe列的样本分位数。
若要使用自己的聚合函数,只需将其传入aggregate或agg方法:
- 面向列的多函数应用
对Series或DataFrame列的聚合运算其实就是使用aggregate(使用自定义函数)或调用诸如mean、std之类的方法。
对于DataFrame,你还有更多选择,你可以定义一组应用于全部列的一组函数,或不同的列应用不同的函数。假设我们想要对tip_pct和total_bill列计算三个统计信息:
也可以传入带有自定义名称的一组元组:
若想要对一个列或不同的列应用不同的函数,具体的办法是向agg传入一个从列名映射到函数的字典:
- 以“没有行索引”的形式返回聚合数据
聚合数据都有由唯一的分组键组成的索引(可能还是层次化的),由于并不总是需要如此,所以可以向groupby传入as_index=False以禁用该功能。
10.3 apply:一般性的“拆分-应用-合并”
apply会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起。
- 禁止分组键
分组键会跟原始对象的索引共同构成结果对象的层次化索引。将group_keys=False传入groupby即可禁止该效果。
- 分位数和桶分析
使用qcut可以根据样本分位数得到大小相等的桶,传入labels=False可只获取分位数的编号。
- 示例:用特定于分组的值填充缺失值
fillna工具可以用一个固定值或由数据集本身所衍生出来的值去填充NA值:
若对不同的分组填充不同的值,一种方法是将数据分组,并使用apply和一个能够对各数据块调用fillna的函数即可。
- 示例:随机采样和排列
抽取的方法有sample方法。
一个长度为52的Series,其索引包括牌名,值则是21点或其他游戏中用于计分的点数:
从整副牌中抽出5张:
要从每种花色中随机抽取两张牌。由于花色是牌名的最后一个字符,所以我们可以据此进行分组,并使用apply:
10.4 透视表和交叉表
透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。
传入margins=True添加分项小计。这将会添加标签为All的行和列,其值对应于单个等级中所有数据的分组统计。
- 交叉表:crosstab(一种用于计算分组频率的特殊透视表)
crosstab的前两个参数可以是数组或Series,或是数组列表。