Python数据分析:groupby分组函数
本文系统介绍了Pandas中groupby函数的5种核心用法:1)单列分组单列聚合,2)单列分组多列聚合,3)多列分组多列聚合,4)结合agg实现自定义聚合,5)使用transform保持原数据结构的分组操作。通过销售数据分析示例,详细展示了每种方法的语法特点和适用场景,并提供了实用小贴士。掌握这些技巧能显著提升数据分析效率,特别适合需要按特征进行分组统计的业务场景。
📊 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 数据分析!🚀
更多推荐
所有评论(0)