一、GroupBy技术
Hadley Wickham(许多热门R语言包的作者)创造了一个用于表示分组运算的术语"split-apply-combine"(拆分-应用-合并)。第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后,将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。如下图所示:
1、假设你想要按key1进行分组,并计算data1列的平均值。
访问data1,并根据key1调用groupby。变量grouped是一个GroupBy对象。它实际上还没有进行任何计算,只是含有一些有关分组键df['key1']的中间数据而已。换句话说,该对象已经有了接下来对各分组执行运算所需的一切信息。例如,我们可以调用GroupBy的mean方法来计算分组平均值:
如果我们一次传入多个数组的列表,就会得到不同的结果。通过两个键对数据进行了分组,得到的Series具有一个层次化索引(由唯一的键对组成):
还可以将列名(可以是字符串、数字或其他Python对象)用作分组键:
在执行df.groupby('key1').mean()时,结果中没有key2列。这是因为df['key2']不是数值数据(俗称“麻烦列”),所以被从结果中排除了。默认情况下,所有数值列都会被聚合。
GroupBy的size方法,它可以返回一个含有分组大小的Series:
上面的例子分组键均为Series。实际上,分组键可以是任何长度适当的数组:
注意,任何分组关键词中的缺失值,都会被从结果中除去。
2、对分组进行迭代
GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)。看下面的例子:
对于多重键的情况,元组的第一个元素将会是由键值组成的元组:
将这些数据片段做成一个字典:
groupby默认是在axis=0上进行分组的,通过设置也可以在其他任何轴上进行分组。拿上面例子中的df来说,我们可以根据dtype对列进行分组:
3、选取一列或列的子集
对于由DataFrame产生的GroupBy对象,如果用一个(单个字符串)或一组(字符串数组)列名对其进行索引,就能实现选取部分列进行聚合的目的。等价:
4、通过字典或Series进行分组
已知列的分组关系:
将这个字典传给groupby,来构造数组,但我们可以直接传递字典(我包含了键“f”来强调,存在未使用的分组键是可以的):
Series也有同样的功能,它可以被看做一个固定大小的映射:
5、通过函数进行分组
比起使用字典或Series,使用Python函数是一种更原生的方法定义分组映射。任何被当做分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。具体点说,以people为例,其索引值为人的名字。你可以计算一个字符串长度的数组,更简单的方法是传入len函数:
将函数跟数组、列表、字典、Series混合使用也不是问题,因为任何东西在内部都会被转换为数组:
6、根据索引级别分组
层次化索引数据集最方便的地方就在于它能够根据轴索引的一个级别进行聚合:
要根据级别分组,使用level关键字传递级别序号或名字:
二、数据聚合
聚合指的是任何能够从数组产生标量值的数据转换过程。之前的例子已经用过一些,比如mean、count、min以及sum等。你可能想知道在GroupBy对象上调用mean()时究竟发生了什么。许多常见的聚合运算都有进行优化。
经过优化的groupby方法
你可以使用自己发明的聚合运算,还可以调用分组对象上已经定义好的任何方法。例如,quantile可以计算Series或DataFrame列的样本分位数:
作者:owolf
链接:https://www.jianshu.com/p/3c67d20e6aa9
共同学习,写下你的评论
评论加载中...
作者其他优质文章