pandas数据分组groupby()和统计函数agg()的使用

  • Post category:Python

请看下面的详细讲解。

pandas数据分组groupby()和统计函数agg()的使用

什么是数据分组和统计函数

在数据分析领域,数据分组和统计函数是两个非常常用的概念。数据分组可以将数据按照某个属性进行分组,然后对每个组进行统计分析。而统计函数则是针对数据分析后的结果,对每个组的数据进行汇总计算,提取出这些数据的某些特征。

在pandas中,我们可以通过调用groupby()方法进行分组操作,通过agg()方法进行统计函数操作。

groupby()方法的基本用法

groupby()方法可以接受一个或多个参数作为分组的依据,并且会返回一个DataFrameGroupBy对象,表示按照分组依据进行分组后的数据集。

下面是一个简单的示例,我们按照城市对学生进行分组:

import pandas as pd

data = {
    'city': ['北京', '北京', '上海', '上海', '广州', '深圳'],
    'name': ['小明', '小红', '小张', '小李', '小赵', '小王'],
    'age': [18, 17, 19, 22, 20, 21],
    'score': [80, 78, 85, 90, 95, 91]
}

df = pd.DataFrame(data)
grouped = df.groupby('city')

在这个例子中,我们首先创建了一个包含城市、姓名、年龄和成绩的DataFrame对象,并将其赋值给了df变量。然后使用groupby()方法,按照df中的“city”列进行分组,并将结果保存在grouped变量中。

agg()方法的基本用法

agg()方法是一种统计函数,可以接受一个或多个函数作为参数,对每个分组的数据进行统计。

下面是一个简单的示例,我们将统计每个城市的学生平均年龄和成绩:

import pandas as pd

data = {
    'city': ['北京', '北京', '上海', '上海', '广州', '深圳'],
    'name': ['小明', '小红', '小张', '小李', '小赵', '小王'],
    'age': [18, 17, 19, 22, 20, 21],
    'score': [80, 78, 85, 90, 95, 91]
}

df = pd.DataFrame(data)

grouped = df.groupby('city')
result = grouped.agg({
   'age': 'mean',
   'score': 'mean'
})

在这个例子中,我们首先按照城市进行了分组,然后使用agg()方法,指定了两个统计函数的参数:’age’: ‘mean’,和’score’: ‘mean’。这样,我们就得到了每个城市的学生平均年龄和成绩。

示例一

下面我们用一组具体的数据来演示groupby()和agg()的使用。

数据集内容

假设我们有一组销售数据,包含产品名称、销售渠道、销售时间、销售价格等信息,数据如下:

产品名称 销售渠道 销售时间 销售价格
A 天猫超市 2019-01-01 100
B 京东商城 2019-01-01 200
A 天猫超市 2019-01-02 150
B 京东商城 2019-01-02 220
A 淘宝旗舰店 2019-01-01 120

我们要分别统计每种产品在不同销售渠道上每天的销售额和销售量。

分组操作

我们首先按照产品名称和销售渠道进行分组操作。

import pandas as pd

data = {
    'product': ['A', 'B', 'A', 'B', 'A'],
    'channel': ['天猫超市', '京东商城', '天猫超市', '京东商城', '淘宝旗舰店'],
    'date': ['2019-01-01', '2019-01-01', '2019-01-02', '2019-01-02', '2019-01-01'],
    'price': [100, 200, 150, 220, 120]
}

df = pd.DataFrame(data)
grouped = df.groupby(['product', 'channel', 'date'])

在这个例子中,我们使用了一个列表,将产品名称、销售渠道和销售时间都列出来,表示按照这三个属性进行分组。最终得到的grouped对象是DataFrameGroupBy类型的对象。

统计函数操作

我们接下来使用agg()方法,对每个分组求和和平均值。

result = grouped.agg({
    'price': ['sum', 'mean']
})

在agg()方法中,我们使用字典的形式将需要统计的函数和需要统计的属性列都列出来。在这个例子中,我们统计了“price”的总和和平均值。

最终得到的统计结果如下表:

产品名称 销售渠道 销售时间 销售额总和 销售额平均值
A 天猫超市 2019-01-01 100 100
2019-01-02 150 150
淘宝旗舰店 2019-01-01 120 120
B 京东商城 2019-01-01 200 200
2019-01-02 220 220

示例二

下面我们再用一组具体的数据来演示groupby()和agg()的使用。

数据集内容

假设我们有一组考试成绩数据,包括学生姓名、科目、分数等信息,数据如下:

姓名 科目 分数
张三 语文 85
李四 数学 90
张三 数学 95
李四 英语 80
王五 语文 85

我们要统计每位学生的单科平均分、平均分,并按照平均分从高到低排序。

分组操作

我们首先按照姓名进行分组操作。

import pandas as pd

data = {
    'name': ['张三', '李四', '张三', '李四', '王五'],
    'subject': ['语文', '数学', '数学', '英语', '语文'],
    'score': [85, 90, 95, 80, 85]
}

df = pd.DataFrame(data)
grouped = df.groupby(['name'])

在这个例子中,我们使用了“name”列进行分组操作,得到了一个DataFrameGroupBy类型的grouped对象。

统计函数操作

我们接下来使用agg()方法,对每个分组求平均值。

result = grouped.agg({
    'score': 'mean'
})

在这个例子中,我们只统计了“score”的平均值。

最终得到的统计结果如下表:

姓名 平均分
李四 85.0
王五 85.0
张三 90.0

最后,我们按照平均分从高到低进行排序。

result = result.sort_values(by=['平均分'], ascending=False)

这个例子中,我们使用了sort_values()方法对统计结果进行排序操作。

最终得到的结果如下:

姓名 平均分
张三 90.0
李四 85.0
王五 85.0

总结

使用pandas进行数据分组和统计函数操作是数据分析中非常常用的技能。通过本文的介绍,相信您对这两个方法已经有了更深刻的认识。如果您还有其他问题或疑问,欢迎在下方留言。