pandas数据预处理之dataframe的groupby操作方法

  • Post category:Python

下面我为大家详细讲解pandas数据预处理中dataframe的groupby操作方法的完整攻略。

一、groupby的基础知识

1.1 概述

groupby是pandas的一个非常常用的功能,它可以将数据分组并执行聚合操作。在使用groupby时,需要先指定一个或多个列作为groupby的key,然后对groupby后的数据做统计分析。

1.2 语法

基本的语法格式如下:

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

参数说明:

  • by:指定group by时的列或者是列表
  • axis:指定group by时的轴,0表示行,1表示列,默认值为0
  • level:多重索引下指定选择的索引
  • ass_index:是否通过聚合的键使用该键作为索引,默认是True
  • sort:默认是对group by的结果进行排序,设置为False可以提高性能
  • group_keys:是否对结果进行分组,默认是True
  • squeeze:当返回的结果只有一列时是否转化为Series,默认是False

二、groupby的使用示例

2.1 groupby的默认聚合方式

除了常规的sum、count等函数的聚合方式,groupby的默认聚合方式需要分为两种情况统计处理方式:

  • 对于除了group by以外的列,使用聚合函数进行统计处理
  • 对于group by后的列(是group by列),如果为数字类型,则进行统计处理,否则无法进行统计处理

下面通过几个数据处理例子,看一下groupby函数的用法。

首先,我们先导入需要使用的pandas库,并且读取一个csv格式的数据文件,命名为df:

import pandas as pd

df = pd.read_csv('data.csv')

假设我们的数据长这样:

姓名 班级 年龄 性别 成绩
张三 一班 20 80
李四 一班 22 81
王五 二班 21 72
赵六 二班 22 73
孙七 三班 19 79
张八 三班 20 80

我们现在想了解一下它们每个班级的成绩分布情况。我们可以通过groupby来实现。

grouped = df.groupby('班级')
print(grouped)

此时,我们可以看到grouped的返回值是一个groupby对象,而不是DataFrame对象:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7ff134ff4e90>

在groupby对象中,我们可以使用size()方法来查看每个下标的数据量大小:

grouped.size()

我们会得到如下的输出结果:

班级
一班    2
三班    2
二班    2
dtype: int64

而另一个非常常用的统计方式是mean(),它可以直接计算某个列的平均值:

grouped['成绩'].mean()

这个result的结果如下:

班级
一班    80.5
三班    79.5
二班    72.5
Name: 成绩, dtype: float64

如果想要返回整个DataFrame,只需要把需要所有聚合的列都放到groupby中:

grouped = df.groupby(['班级','性别'])
grouped.mean()

上面的代码统计了不同班级和性别的学生的平均成绩,输出结果如下:

          年龄    成绩
班级 性别          
一班 女   22.0  81.0
    男   20.0  80.0
三班 女   19.0  79.0
    男   20.0  80.0
二班 女   21.0  72.0
    男   22.0  73.0

上面的代码分别统计了不同班级和性别的学生的年龄和平均成绩。

2.2 groupby后聚合操作的自定义方式

groupby标准聚合函数并不能满足我们的所有需求,所以我们需要添加自定义函数进行聚合操作。我们可以使用agg()函数来使用自定义的聚合函数。

下面我们将使用一个实际例子来说明agg()的使用方法。

假设有一个高尔夫比赛,每位选手总共打了10个洞,现在想要统计每个选手的平均杆数。当然,杆数越少,代表选手表现越优秀。

使用groupby统计所有选手的平均杆数:

import pandas as pd

data = {
        'player': ['Jack', 'Jack', 'Jack', 'Tom', 'Tom', 'Tom'],
        'hole1': [2, 3, 4, 2, 3, 4],
        'hole2': [3, 4, 5, 3, 4, 5],
        'hole3': [4, 5, 6, 4, 5, 6],
        'hole4': [2, 3, 5, 2, 3, 5],
        'hole5': [3, 4, 6, 3, 4, 6],
        'hole6': [5, 6, 3, 5, 6, 3],
        'hole7': [2, 3, 4, 2, 3, 4],
        'hole8': [2, 3, 4, 2, 3, 4],
        'hole9': [3, 4, 6, 3, 4, 6],
        'hole10': [2, 3, 4, 2, 3, 4]
}

df = pd.DataFrame(data)

grouped = df.groupby('player').agg({'hole1': 'mean', 'hole2': 'mean', 'hole3': 'mean', 
                                    'hole4': 'mean', 'hole5': 'mean', 'hole6': 'mean', 
                                    'hole7': 'mean', 'hole8': 'mean', 'hole9': 'mean', 'hole10': 'mean'})

print(grouped)

代码运行结果如下:

       hole1  hole2  hole3  hole4  hole5  hole6  hole7  hole8  hole9  hole10
player
Jack     3.0    4.0    5.0    3.3    4.3    4.7    3.0    3.0    4.3     3.0
Tom      3.0    4.0    5.0    3.3    4.3    4.7    3.0    3.0    4.3     3.0

我们可以看到这些选手打高尔夫的水平差异很小。

总结

以上两种方法分别是groupby的基础知识和使用示例。对于数据分组和聚合操作,groupby是我们经常使用的方法,掌握groupby的使用技巧能够提高我们的数据预处理能力,加快数据分析效率。