📊 Python数据分析利器:深入掌握 Pandas 的 groupby 函数

在进行数据分析时,我们经常需要对数据按照某些特征进行分组,然后对每组数据进行统计、聚合或转换。Pandas 中的 groupby 函数正是为此而生,它是数据分析中最常用、最强大的工具之一。

今天,我们就来系统梳理 groupby 的常见用法,从基础到进阶,助你轻松玩转分组分析!


1️⃣ 一列分组 + 一列聚合(最基础用法)

假设我们有一个销售数据表,包含「城市」和「销售额」两列:

import pandas as pd

df = pd.DataFrame({
    'city': ['北京', '上海', '北京', '广州', '上海'],
    'sales': [100, 150, 200, 120, 180]
})

我们想按城市汇总总销售额:

result = df.groupby('city')['sales'].sum()
print(result)

输出:

city
北京    300
上海    330
广州    120
Name: sales, dtype: int64

要点

  • groupby('city') 按城市分组
  • ['sales'] 选择要聚合的列
  • .sum() 是聚合函数(也可用 mean、max、count 等)

2️⃣ 一列分组 + 多列聚合

如果数据包含多列数值,比如「销售额」和「利润」:

df = pd.DataFrame({
    'city': ['北京', '上海', '北京', '广州', '上海'],
    'sales': [100, 150, 200, 120, 180],
    'profit': [20, 30, 40, 25, 35]
})

我们可以对多个列同时聚合:

result = df.groupby('city')[['sales', 'profit']].sum()
print(result)

输出:

      sales  profit
city              
北京     300      60
上海     330      65
广州     120      25

💡 也可以使用 agg() 实现更灵活的聚合(见第4部分)。


3️⃣ 多列分组 + 多列聚合

当需要按多个维度分组时(如「城市」+「产品类别」):

df = pd.DataFrame({
    'city': ['北京', '北京', '上海', '上海', '北京'],
    'category': ['A', 'B', 'A', 'B', 'A'],
    'sales': [100, 150, 200, 120, 180],
    'profit': [20, 30, 40, 25, 35]
})

result = df.groupby(['city', 'category'])[['sales', 'profit']].sum()
print(result)

输出(MultiIndex):

               sales  profit
city category              
北京 A           280      55
     B           150      30
上海 A           200      40
     B           120      25

📌 使用 reset_index() 可将分组键转为普通列:

result.reset_index(inplace=True)

4️⃣ groupby + agg:自定义聚合方式

agg() 允许对不同列应用不同的聚合函数,甚至多个函数!

result = df.groupby('city').agg({
    'sales': 'sum',
    'profit': ['mean', 'max']
})
print(result)

输出:

      sales profit      
        sum   mean max
city                  
北京     330   32.5  35
上海     320   32.5  40

✨ 还可以传入自定义函数或 lambda:

df.groupby('city').agg({
    'sales': lambda x: x.max() - x.min(),
    'profit': 'std'
})

5️⃣ groupby + transform:保留原始结构的分组操作

agg 不同,transform 返回与原 DataFrame 相同形状的结果,常用于标准化、填充缺失值等场景。

例如:计算每个城市销售额占该城市总销售额的比例:

df['sales_ratio'] = df['sales'] / df.groupby('city')['sales'].transform('sum')
print(df)

输出:

  city category  sales  profit  sales_ratio
0   北京        A    100      20     0.303030
1   北京        B    150      30     0.454545
2   上海        A    200      40     0.625000
3   上海        B    120      25     0.375000
4   北京        A    180      35     0.545455

transform 的关键优势:不改变原始行数,结果可直接作为新列加入原表。


🔚 小结

场景 代码示例 特点
单列分组单列聚合 df.groupby('A')['B'].sum() 最基础
单列分组多列聚合 df.groupby('A')[['B','C']].mean() 批量处理
多列分组多列聚合 df.groupby(['A','B'])[['C','D']].sum() 多维分析
自定义聚合 df.groupby('A').agg({'B':'sum', 'C':['mean','max']}) 灵活强大
分组变换 df.groupby('A')['B'].transform('mean') 保持原结构

掌握这些 groupby 技巧,你的数据分析效率将大幅提升!赶紧在你的项目中试试吧~


📘 小贴士

  • groupby 后默认会丢弃 NaN 分组(可通过 dropna=False 保留)
  • 使用 as_index=False 可避免分组列变成索引
  • 结合 apply() 可实现更复杂的自定义逻辑

如果你觉得这篇文章有帮助,欢迎点赞、转发,让更多人一起学好 Python 数据分析!🚀

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐