《利用Python进行数据分析》 第二版

《利用Python进行数据分析》 10.1 GroupBy机

2018-12-04  本文已影响30人  CCC考研

10.1 GroupBy机制


1.Hadley Wickham创造了用于描述组操作的术语拆分-应用-联合(split-apply-combine)

第一步,数据包含在pandas对象中,可以是Series、DataFrame或其他数据结构

第二步,根据你提供的一个或多个键分离到各个组中

注:分离操作是在数据对象的特定轴向上进行的。例如,DataFrame可以在它的行方向(axis=0)或列方向(axis=1)进行分组

第三步,函数就应用到各个组中,产生新的值

第四步,所有函数的应用结果联合为一个结果对象

注:结果对象的形式取决于对数据进行的操作

示例:一个简单的分组聚合(见图10-1)

图10-1:分组聚合图示

2.分组键可是多种形式,并且键不一定是完全相同的类型

(1)与需要分组的轴向长度一致的值列表或值数组

(2) DataFrame的列名的值

(3)可以将分组轴向上的值和分组名称相匹配的字典或Series

(4) 可以在轴索引或索引中的单个标签上调用的函数

注:后三种方法是可以产生用于分隔对象的值数组的快捷方式

示例:DataFrame小型表格数据集(见图10-2)

图10-2:Series型分组
图10-2:利用多个键进行分组 图10-2:利用列名进行分组 图10-2:利用轴向长度一致的数组分组

利用size()返回包含组大小信息的Series(见图10-3)

图10-3:size()用法

注:分组键中的任何缺失值将被排除在结果之外


10.1.1遍历各分组


1.GroupBy对象支持迭代,会生成一个包含组名和数据块的2维元组序列(见图10-4)

图10-4 分组键迭代

注:在多个分组键的情况下,元组中的第一个元素是键值的元组


2.选择在任何一块数据上进行你想要的操作,使用一行代码计算出数据块的字典(见图10-5)

图10-5:使用代码计算出数据块字典

3.默认情况下,groupby在axis=0的轴向上分组,也可以在其他任意轴向上进行分组(见图10-6)

图10-6:多轴向分组

10.1.2 选择一列或所有列的子集


1.从DataFrame创建的GroupBy对象用列名称或列名称数组进行索引时,产生用于聚合的列子集的效果

df.groupby('key1')['data1']

df.groupby('key1')[['data2']]

是下面代码的语法糖:

df['data1'].groupby(df['key1'])

df[['data2']].groupby(df['key1'])    #Series分组键

注:语法糖,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。


2.处理大型数据,聚合少部分列

示例:计算data2列均值(见图10-7)

图10-7 :计算data2列均值

注:如果传递的是列表或数组,则此索引操作返回的对象是分组的DataFrame;如果只有单个列名作为标量传递,则为分组的Series(见图10-8)

图10-8:单个列名标量传递

10.1.3 使用字典和Series分组


1.使用字典分组 

示例DataFrame:拥有各列的分组对应关系,把各列按组累加(见图10-9)

图10-9:使用字典进行分组

2.Series也有相同的功能,可以视为固定大小的映射(见图10-10)

注:映射,两个元素的之间元素相互“对应”的关系

图10-10:使用Serie分组

10.1.4 使用函数分组


1.利用Python函数分组是定义分组关系的一种通用的方式

作为分组键传递的函数将会按照每个索引值调用一次,同时返回值会被用作分组名称

示例:考虑上一节的示例DataFrame,其中人名作为索引值,计算字符串的长度作为分组名称(见图10-11)

图10-11:利用函数分组

2.将函数与数组、字典或Series进行混合,所有的对象都会在内部转换为数组(见图10-12)

图10-12:混合分组

10.1.5 根据索引层级分组


1.分层索引的数据集的便利:能够在轴索引的某个层级上进行聚合

示例:(见图10-13)

图10-13:根据索引层级分组

注:(1)pandas.MultiIndex.from_arrays

classmethod MultiIndex.from_arrays(arrays,sortorder=None,names=None)

Convert arrays to MultiIndex

(2)根据层级分组时,将层级数值或层级名称传递给level关键字


上一篇下一篇

猜你喜欢

热点阅读