pandas数据聚合与分组运算——groupby方法

《pandas数据聚合与分组运算——groupby方法》

简介

pandas中一类非常重要的操作是数据聚合与分组运算。通过groupby方法能够实现对数据集的拆分、统计、转换等操作,这个过程一气呵成。

在本文中,你将学到:

  • 选取特定列分组;
  • 对分组进行迭代;
  • 通过字典或Series分组;
  • 通过函数分组;
  • 通过索引级别分组。

Groupby技术

一个完整的分组运算过程是:“split-apply-combine”(拆分-应用-合并)。首先将数据分组拆分,按照组别划分。这种分组可以针对行(axis=0)或列(axis=1);然后针对分好的组别应用操作函数(聚合、统计等);最后这些结果会合并到最终对象中。这个过程如下:

《pandas数据聚合与分组运算——groupby方法》

接下来我们一一介绍。

选取特定列分组

直接来看一个例子:

我们有这样一个DataFrame,假设我们想通过 x 进行分组,并计算 d1 列的平均值,有这样两种方式:

可以看出这里的变量 a 是一个 GroupBy 对象,可以认为它是做好了分组的中间数据。接下来我们就可以通过 mean() 方法计算平均值:

结果表明,通过 x 分组后有 'a', 'b' 两组,最后得到两组的平均值。以上是通过一列进行分组,我们还可以指定多列分组:

在上面的例子中,我们使用的分组都是基于已经有的列名。事实上,我们也可以根据自定义的数组来分组,假如我有如下两个数组:

根据数组分组:

GroupBy对象迭代

GroupBy对象也支持迭代,可以产生一个二元元组(由分组索引和数据集组成)。比如:

如果是多个分组索引,二元元组的第一个元素就是分组索引组成的元组:

既然知道groupby对象是一个二元元组,一个可能有用的操作技巧是将它转变成字典,然后就可以通过键访问对应的数据:

除了在行上进行分组,我们也可以在列上进行分组:

通过 dtypes 能够获取每列的数据类型,接着我们根据数据类型对列进行分组:

通过字典或Series分组

在前面就讲到可以根据自定义的数组进行分组,那么我们也可以传入一个字典或者Series映射现有的行或列,再通过自定义的数组

建立一个字典映射:

将现有的行索引按照 ['joe', 'lucy'] 来分组。

或者使用Series:

通过函数进行分组

假设有这样地数据:

我们想根据行索引字符串的长度进行分组,就可以直接调用 len 函数:

行索引1、2就表示行索引字符串长度为1和2的两个组。

我们还可以将函数和数组、列表、字典、Series混合使用:

通过索引级别分组

对于层次化索引分组,可以根据 level 参数选择索引级别进行分组。如果有下面这个层次化数据集:

level 参数可以传入级别名称或者编号:

设置了 axis=1 ,表示在列上进行分组从外到内的级别编号依次0、1…

总结

再本文中初步介绍了groupby方法的使用,可以根据不同的方式(字典、Series、数组、函数、索引级别)选择分组索引进行分组。在后面的文章中我们还会详细介绍传入函数的应用,因为这在实际工作中使用较多。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

12 − 6 =