news 2026/6/11 10:04:52

【Python】数据分析实战:pandas groupby() 从分组聚合到数据洞察

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】数据分析实战:pandas groupby() 从分组聚合到数据洞察

1. 为什么你需要掌握pandas的groupby()?

如果你经常和Excel打交道,一定用过数据透视表。pandas的groupby()就是Python世界里更强大的"数据透视表",它能帮你把杂乱的数据变成清晰的洞察。想象你手里有一份销售数据,里面有日期、地区、产品类别和销售额。老板突然问你:"上个季度每个地区的畅销产品是什么?"或者"哪个产品线的增长最快?"这时候,groupby()就是你的救命稻草。

我刚开始用Python做数据分析时,最头疼的就是如何按条件汇总数据。直到发现了groupby(),原来需要写几十行循环代码才能完成的工作,现在一行就能搞定。比如最近分析用户行为数据时,我需要统计每个年龄段用户的平均停留时长,用groupby()配合mean(),三秒钟就得到了结果。

2. groupby()基础用法全解析

2.1 创建你的第一个分组

让我们从一个简单的例子开始。假设我们有一个包含水果销售数据的DataFrame:

import pandas as pd data = { '水果': ['苹果', '香蕉', '苹果', '橙子', '香蕉', '苹果', '橙子', '香蕉'], '月份': ['一月', '一月', '二月', '二月', '三月', '三月', '三月', '三月'], '销量': [100, 150, 200, 120, 180, 90, 110, 210] } df = pd.DataFrame(data)

现在,我们想按水果种类分组:

grouped = df.groupby('水果')

这个grouped对象就像是一个待拆的礼物盒,里面已经按水果种类分好了类,但还没有进行任何计算。要看到实际效果,我们需要应用聚合函数。

2.2 常用聚合函数实战

聚合函数是groupby()的核心武器。最常用的包括:

  • sum(): 求和
  • mean(): 平均值
  • max()/min(): 最大值/最小值
  • count(): 计数
  • std(): 标准差

让我们计算每种水果的总销量:

total_sales = grouped['销量'].sum() print(total_sales)

输出会是:

水果 苹果 390 香蕉 540 橙子 230 Name: 销量, dtype: int64

如果想一次性计算多个指标,可以用agg()函数:

sales_stats = grouped['销量'].agg(['sum', 'mean', 'max', 'min']) print(sales_stats)

3. 高级分组技巧:玩转多维度分析

3.1 多列分组:透视你的数据

现实中的数据往往更复杂。假设我们的数据增加了"地区"列:

data['地区'] = ['北京', '上海', '北京', '上海', '广州', '广州', '北京', '上海'] df = pd.DataFrame(data)

现在我们可以同时按水果种类和地区分组:

multi_grouped = df.groupby(['水果', '地区'])['销量'].sum() print(multi_grouped)

这种多级分组的结果是一个层次化索引的Series,非常适合进一步分析。

3.2 分组后重置索引

上面的结果可能不太方便后续处理,可以用reset_index()把它变回普通DataFrame:

flat_result = multi_grouped.reset_index() print(flat_result)

4. 进阶应用:自定义函数与数据转换

4.1 使用apply()实现自定义分析

groupby()的强大之处在于它能配合自定义函数。比如,我们想找出每个水果销量最高的月份:

def top_month(group): return group.loc[group['销量'].idxmax()] result = df.groupby('水果').apply(top_month) print(result)

4.2 transform():保持原始形状的转换

有时候我们不想改变数据形状,只是想在每组内进行计算。比如,我们想计算每种水果销量与平均销量的差值:

df['与平均差'] = df.groupby('水果')['销量'].transform(lambda x: x - x.mean()) print(df)

transform()会返回一个与原始数据相同长度的结果,非常适合特征工程。

5. 实战案例:电商用户行为分析

让我们用一个真实的案例来整合所学内容。假设我们有电商平台的用户行为数据:

import numpy as np import pandas as pd # 生成模拟数据 np.random.seed(42) user_ids = np.random.randint(1000, 9999, 1000) dates = pd.date_range('2023-01-01', periods=30).repeat(33)[:1000] actions = np.random.choice(['浏览', '加购', '购买'], 1000, p=[0.7, 0.2, 0.1]) values = np.where(actions == '购买', np.random.randint(100, 500, 1000), 0) df = pd.DataFrame({ 'user_id': user_ids, 'date': dates, 'action': actions, 'value': values })

5.1 分析每日用户行为

daily_actions = df.groupby(['date', 'action']).size().unstack() print(daily_actions)

5.2 计算用户价值指标

user_stats = df.groupby('user_id').agg({ 'action': lambda x: (x == '购买').sum(), 'value': 'sum' }).rename(columns={'action': '购买次数', 'value': '总消费'}) print(user_stats.sort_values('总消费', ascending=False).head())

5.3 识别高价值用户

high_value_users = user_stats[user_stats['总消费'] > 1000] print(f"高价值用户数量:{len(high_value_users)}")

6. 性能优化与常见陷阱

6.1 加速groupby操作的技巧

当数据量很大时,groupby可能会变慢。可以尝试:

  1. 只选择需要的列:
df[['group_col', 'value_col']].groupby('group_col')
  1. 使用分类数据类型:
df['group_col'] = df['group_col'].astype('category')
  1. 考虑使用Dask或Modin等库处理超大数据集。

6.2 避免的常见错误

  1. 忘记reset_index()导致后续操作困难
  2. 在分组前没有处理缺失值
  3. 对大分组使用apply()导致性能问题
  4. 混淆transform和apply的使用场景

7. 从分组到洞察:完整分析流程

让我们用一个销售数据分析案例,展示如何从原始数据到商业洞察:

  1. 数据准备与清洗
  2. 按关键维度分组
  3. 计算核心指标
  4. 可视化关键发现
  5. 得出可执行的建议
# 示例:分析产品季节性 monthly_sales = df.groupby([df['date'].dt.month, 'action'])['value'].sum().unstack() monthly_sales.plot(kind='bar', figsize=(10,6))

通过这样的分析,你可能会发现某些产品在特定月份表现特别好,从而为库存和营销计划提供依据。

8. 结合其他pandas功能提升分析效率

groupby()可以和其他pandas功能强强联合:

  • 与pivot_table()结合进行多维分析
  • 与merge()结合丰富分组结果
  • 与时间序列功能结合进行时间维度分析

例如,我们可以计算每周滚动平均:

weekly_avg = df.groupby('user_id').rolling('7D', on='date')['value'].mean()

在实际项目中,我发现groupby()配合query()能极大提高代码可读性:

df.groupby('department').query('salary > 5000')['bonus'].mean()

掌握groupby()后,你会发现自己处理数据的思维方式也在改变。以前看到数据就想写循环,现在会先思考:"这个分析可以用什么分组方式实现?"这种思维转变,才是数据分析师真正的成长。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 10:01:31

100种社会实践

人机协作,仅供参考,注意安全百业体验:从校园到社会的100种实践路径社会实践是连接理论与现实的桥梁,是青年成长为社会人的必经之路。以下从十个维度梳理100种具体可行的社会实践形式,为不同专业背景和兴趣方向的学生提…

作者头像 李华
网站建设 2026/6/11 10:00:03

ComfyUI工业设计革命:从创意瓶颈到高效产出的智能化转型之路

ComfyUI工业设计革命:从创意瓶颈到高效产出的智能化转型之路 【免费下载链接】ComfyUI The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI 你是…

作者头像 李华
网站建设 2026/6/11 9:58:54

3个秘诀揭秘:如何用Awesome Obsidian快速美化你的知识管理空间

3个秘诀揭秘:如何用Awesome Obsidian快速美化你的知识管理空间 【免费下载链接】awesome-obsidian 🕶️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian 还在为Obsidian单调的界面感到乏味吗&#xf…

作者头像 李华
网站建设 2026/6/11 9:56:53

NanaZip:现代Windows压缩工具的终极进化指南

NanaZip:现代Windows压缩工具的终极进化指南 【免费下载链接】NanaZip The 7-Zip derivative intended for the modern Windows experience 项目地址: https://gitcode.com/gh_mirrors/na/NanaZip 还在为传统压缩软件陈旧界面和有限功能而烦恼吗?…

作者头像 李华
网站建设 2026/6/11 9:55:53

【毕业设计】基于Android studio的零食商城app的设计与实现网上零食销售系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华