📊 Python数据分析利器:深入掌握 Pandas 的 groupby 函数
在进行数据分析时,我们经常需要对数据按照某些特征进行分组,然后对每组数据进行统计、聚合或转换。Pandas 中的 groupby 函数正是为此而生,它是数据分析中最常用、最强大的工具之一。
今天,我们就来系统梳理 groupby 的常见用法,从基础到进阶,助你轻松玩转分组分析!
1️⃣ 一列分组 + 一列聚合(最基础用法)
假设我们有一个销售数据表,包含「城市」和「销售额」两列:
import pandas as pddf = pd.DataFrame({'city': ['北京', '上海', '北京', '广州', '上海'],'sales': [100, 150, 200, 120, 180]})
我们想按城市汇总总销售额:
result = df.groupby('city')['sales'].sum()print(result)
输出:
city北京 300上海 330广州 120Name: sales, dtype: int64
✅ 要点:
.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 profitcity 北京 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 profitcity 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 maxcity 北京 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_ratio0 北京 A 100 20 0.3030301 北京 B 150 30 0.4545452 上海 A 200 40 0.6250003 上海 B 120 25 0.3750004 北京 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 可避免分组列变成索引
如果你觉得这篇文章有帮助,欢迎点赞、转发,让更多人一起学好 Python 数据分析!🚀