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

发布时间:2026/6/11 10:04:52
【Python】数据分析实战:pandas groupby() 从分组聚合到数据洞察 1. 为什么你需要掌握pandas的groupby()如果你经常和Excel打交道一定用过数据透视表。pandas的groupby()就是Python世界里更强大的数据透视表它能帮你把杂乱的数据变成清晰的洞察。想象你手里有一份销售数据里面有日期、地区、产品类别和销售额。老板突然问你上个季度每个地区的畅销产品是什么或者哪个产品线的增长最快这时候groupby()就是你的救命稻草。我刚开始用Python做数据分析时最头疼的就是如何按条件汇总数据。直到发现了groupby()原来需要写几十行循环代码才能完成的工作现在一行就能搞定。比如最近分析用户行为数据时我需要统计每个年龄段用户的平均停留时长用groupby()配合mean()三秒钟就得到了结果。2. groupby()基础用法全解析2.1 创建你的第一个分组让我们从一个简单的例子开始。假设我们有一个包含水果销售数据的DataFrameimport 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()把它变回普通DataFrameflat_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, periods30).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(总消费, ascendingFalse).head())5.3 识别高价值用户high_value_users user_stats[user_stats[总消费] 1000] print(f高价值用户数量{len(high_value_users)})6. 性能优化与常见陷阱6.1 加速groupby操作的技巧当数据量很大时groupby可能会变慢。可以尝试只选择需要的列df[[group_col, value_col]].groupby(group_col)使用分类数据类型df[group_col] df[group_col].astype(category)考虑使用Dask或Modin等库处理超大数据集。6.2 避免的常见错误忘记reset_index()导致后续操作困难在分组前没有处理缺失值对大分组使用apply()导致性能问题混淆transform和apply的使用场景7. 从分组到洞察完整分析流程让我们用一个销售数据分析案例展示如何从原始数据到商业洞察数据准备与清洗按关键维度分组计算核心指标可视化关键发现得出可执行的建议# 示例分析产品季节性 monthly_sales df.groupby([df[date].dt.month, action])[value].sum().unstack() monthly_sales.plot(kindbar, figsize(10,6))通过这样的分析你可能会发现某些产品在特定月份表现特别好从而为库存和营销计划提供依据。8. 结合其他pandas功能提升分析效率groupby()可以和其他pandas功能强强联合与pivot_table()结合进行多维分析与merge()结合丰富分组结果与时间序列功能结合进行时间维度分析例如我们可以计算每周滚动平均weekly_avg df.groupby(user_id).rolling(7D, ondate)[value].mean()在实际项目中我发现groupby()配合query()能极大提高代码可读性df.groupby(department).query(salary 5000)[bonus].mean()掌握groupby()后你会发现自己处理数据的思维方式也在改变。以前看到数据就想写循环现在会先思考这个分析可以用什么分组方式实现这种思维转变才是数据分析师真正的成长。