Hadley Wickham是许多流行R语言软件包的作者,他创造了用于描述组操作的术语拆分-应用-联合(split-apply-combine)。在操作的第一步,数据包含在pandas对象中,可以是Series、DataFrame或其他数据结构,之后根据你提供的一个或多个键分离到各个组中。分离操作是在数据对象的特定轴向上进行的。
分组键可是多种形式的,并且键不一定是完全相同的类型:
下面是一个小型表格数据集作为DataFrame的例子:
假设根据key1标签计算data1列的均值,有多种方法可以实现。其中一种是访问data1并使用key1列(它是一个Series)调用groupby方法:
grouped变量现在是一个GroupBy对象。除了一些关于分组键df[‘key1’]的一些中间数据之外,它实际上还没有进行任何计算。这个对象拥有所有必需的信息,之后可以在每一个分组上应用一些操作。
数据(一个Series)根据分组键进行了聚合,并产生了一个新的Series,这个Series使用key1列的唯一值作为索引。由于DataFrame的列df[‘key1’],结果中的索引名称是’key1’。
如果我们将多个数组作为列表传入,则我们会得到一些不同的结果:
这里使用了两个键对数据进行分组,并且结果Series现在拥有一个包含唯一键对的多层索引:
GroupBy对象支持迭代,会生成一个包含组名和数据块的2维元组序列。考虑以下代码:
在多个分组键的情况下,元组中的第一个元素是键值的元组:
默认情况下,groupby在axis=0的轴向上分组,但你也可以在其他任意轴向上进行分组。例如,我们可以像以下代码一样,根据dtype对我们的示例df的列进行分组:
可以打印各分组,如下:
将从DataFrame创建的GroupBy对象用列名称或列名称数组进行索引时,会产生用于聚合的列子集的效果。
尤其是对于大型数据集,可能只需要聚合少部分列。例如,在处理数据集时,要计算data2列的均值,并获得DataFrame形式的结果。
分组信息可能会以非数组形式存在。考虑另一个示例DataFrame:
现在,假设我拥有各列的分组对应关系,并且想把各列按组累加:
现在,可以根据这个字典构造传给groupby的数组,但是也可以直接传字典:
Series也有相同的功能,可以视为固定大小的映射:
与使用字典或Series分组相比,使用Python函数是定义分组关系的一种更为通用的方式。作为分组键传递的函数将会按照每个索引值调用一次,同时返回值会被用作分组名称。
将函数与数组、字典或Series进行混合并不困难,所有的对象都会在内部转换为数组:
分层索引的数据集有一个非常方便的地方,就是能够在轴索引的某个层级上进行聚合。
根据层级分组时,将层级数值或层级名称传递给level关键字:
评论区(0)