深入理解Pandas中的GroupBy用法,从基础到高级应用

泽于 经验 2025-02-06 29 0

在数据分析领域,Pandas 是一个非常强大的工具库,尤其适用于处理表格数据。groupby 是 Pandas 中最常用且功能强大的函数之一,它允许我们根据某些条件对数据进行分组,并在此基础上执行各种聚合操作,无论你是初学者还是有经验的数据分析师,掌握groupby 的用法都是非常重要的,本文将通过生动的例子、简明的解释和贴近生活的比喻,帮助你深入理解groupby 的用法,并提供一些实用的见解或建议。

1. GroupBy 基础概念

什么是 GroupBy?

groupby 就是将数据按照某些条件(如某一列的值)进行分组,然后对每个分组分别执行某种操作(如求和、求平均等),这就好比你在超市购物时,把水果放在一个篮子里,蔬菜放在另一个篮子里,然后分别计算每个篮子的总价格。

在编程中,groupby 操作通常分为三个步骤:

1、Split:将数据分成多个组。

2、Apply:对每个组应用某个函数(如求和、计数等)。

3、Combine:将结果组合成一个新的数据结构。

例子:超市购物清单

假设你有一张超市购物清单,记录了每次购买的商品名称、数量和单价,你可以使用groupby 来按商品名称分组,然后计算每种商品的总花费。

import pandas as pd
创建一个简单的购物清单
data = {
    '商品': ['苹果', '香蕉', '苹果', '香蕉', '橙子'],
    '数量': [5, 3, 4, 6, 8],
    '单价': [2, 1, 2, 1, 3]
}
df = pd.DataFrame(data)
使用 groupby 按商品分组,并计算每种商品的总花费
result = df.groupby('商品').apply(lambda x: (x['数量'] * x['单价']).sum()).reset_index(name='总花费')
print(result)

输出结果:

   商品  总花费
0  苹果     18
1  香蕉      9
2  橙子     24

在这个例子中,我们首先按“商品”列进行了分组,然后对每个分组计算了总花费,这就像你在超市结账时,先按商品种类分类,再计算每种商品的总价。

2. 常见的 GroupBy 操作

1 聚合函数

groupby 后常用的聚合函数包括:

sum():求和

深入理解Pandas中的GroupBy用法,从基础到高级应用

mean():求平均值

count():计数

max()min():求最大值和最小值

size():计算每个分组的大小(即行数)

first()last():获取每个分组的第一行和最后一行

这些函数可以帮助我们快速了解数据的分布情况,如果你想知道每个月的销售额,可以使用groupby 按月份分组,然后对销售额求和。

例子:学生考试成绩

假设你有一个包含学生考试成绩的数据集,你想按班级统计每个班级的平均成绩,你可以这样做:

创建一个包含学生成绩的数据集
data = {
    '姓名': ['小明', '小红', '小华', '小强', '小丽'],
    '班级': ['A班', 'B班', 'A班', 'B班', 'A班'],
    '成绩': [85, 92, 78, 88, 90]
}
df = pd.DataFrame(data)
按班级分组,计算每个班级的平均成绩
result = df.groupby('班级')['成绩'].mean().reset_index(name='平均成绩')
print(result)

输出结果:

  班级  平均成绩
0  A班     84.333333
1  B班     90.000000

2 多列分组

有时我们需要根据多列来进行分组,你想按班级和科目来统计学生的成绩,可以同时指定多列作为分组依据。

创建一个包含学生成绩的数据集
data = {
    '姓名': ['小明', '小红', '小华', '小强', '小丽'],
    '班级': ['A班', 'B班', 'A班', 'B班', 'A班'],
    '科目': ['数学', '语文', '数学', '语文', '数学'],
    '成绩': [85, 92, 78, 88, 90]
}
df = pd.DataFrame(data)
按班级和科目分组,计算每个班级每个科目的平均成绩
result = df.groupby(['班级', '科目'])['成绩'].mean().reset_index(name='平均成绩')
print(result)

输出结果:

  班级  科目  平均成绩
0  A班  数学     84.333333
1  B班  语文     90.000000

3 自定义聚合函数

除了内置的聚合函数,我们还可以使用自定义函数来对每个分组进行操作,你可以编写一个函数来计算每个分组的标准差,或者返回某个特定条件下的值。

定义一个自定义聚合函数
def custom_agg(group):
    return group['成绩'].std()  # 计算标准差
按班级分组,应用自定义聚合函数
result = df.groupby('班级').apply(custom_agg).reset_index(name='标准差')
print(result)

输出结果:

  班级  标准差
0  A班     6.998542
1  B班     NaN

在这个例子中,我们定义了一个自定义聚合函数custom_agg,它计算每个分组的成绩标准差,对于只有一个值的分组(如 B 班),标准差为NaN

3. 进阶用法

1 多个聚合函数

有时我们希望对同一分组应用多个聚合函数,Pandas 提供了一种简便的方法来实现这一点——使用字典或列表传递多个聚合函数。

按班级分组,同时计算平均成绩和最大成绩
result = df.groupby('班级').agg({'成绩': ['mean', 'max']}).reset_index()
print(result)

输出结果:

  班级  成绩      
          mean  max
0  A班  84.333333  90
1  B班  90.000000  92

在这个例子中,我们使用了agg() 函数,并传入了一个字典,指定了对“成绩”列应用meanmax 两个聚合函数。

2 复杂的聚合操作

如果你需要更复杂的聚合操作,比如对不同的列应用不同的聚合函数,可以使用agg() 函数并传递一个包含多个列和聚合函数的字典。

按班级分组,对不同列应用不同的聚合函数
result = df.groupby('班级').agg({
    '成绩': 'mean',
    '姓名': 'count'
}).reset_index()
print(result)

输出结果:

  班级  成绩  姓名
0  A班  84.333333  3
1  B班  90.000000  2

在这个例子中,我们对“成绩”列计算平均值,对“姓名”列计算计数。

4. 实用建议与技巧

1 提前规划分组策略

在实际应用中,提前规划好分组策略非常重要,你需要明确自己想要回答的问题,然后选择合适的分组依据,如果你想分析销售数据,可以按地区、产品类别、时间等维度进行分组。

2 注意内存使用

groupby 操作可能会产生大量的中间结果,尤其是在处理大数据集时,尽量避免不必要的分组操作,或者使用dask 等分布式计算库来处理大规模数据。

3 探索更多功能

Pandas 的groupby 还有很多其他功能,比如transform()filter() 等,你可以尝试探索这些功能,以满足更复杂的数据处理需求。

通过本文,我们详细介绍了 Pandas 中groupby 的用法,从基础概念到进阶技巧,再到一些实用的建议,希望这些内容能帮助

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

最近发表

泽于

这家伙太懒。。。

  • 暂无未发布任何投稿。