首页 > pandas数据分析实战训练营 > 项目4:数据分组与聚合分析

项目4:数据分组与聚合分析

数据集:销售数据 | 难度:进阶 | 预计用时:60分钟

学习目标

  • 掌握groupby分组的基本用法
  • 熟练使用常用聚合函数(sum/mean/count/max/min)
  • 学会多列分组和多层索引
  • 掌握agg自定义聚合方法

知识点讲解

1. groupby分组

分组就像Excel里的"分类汇总"功能。先把数据按某个类别分成几组,然后对每组分别计算。

# 按地区分组,计算每组的销售额总和 df.groupby('地区')['销售额'].sum() # 按地区分组,计算每组有多少条记录 df.groupby('地区')['销售额'].count()

groupby的过程可以分成三步理解:拆分(Split) -> 应用(Apply) -> 合并(Combine)。

2. 常用聚合函数

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

3. 多列分组

可以同时按多个维度分组,比如按"地区+产品类别"分组:

# 按地区和产品类别分组 df.groupby(['地区', '产品类别'])['销售额'].sum() # 重置索引,让结果变成普通表格 df.groupby(['地区', '产品类别'])['销售额'].sum().reset_index()

4. agg自定义聚合

agg可以对不同列应用不同的聚合函数,非常灵活:

# 对不同列用不同聚合方式 df.groupby('地区').agg({ '销售额': 'sum', '利润': 'mean', '订单号': 'count' }) # 对同一列用多个聚合函数 df.groupby('地区')['销售额'].agg(['sum', 'mean', 'max', 'min']) # 自定义列名 df.groupby('地区')['销售额'].agg( 总销售额='sum', 平均销售额='mean', 最大单笔='max' )

5. 常用分组技巧

# 对分组结果排序 df.groupby('地区')['销售额'].sum().sort_values(ascending=False) # 获取每组最大的前N条 df.groupby('地区').apply(lambda x: x.nlargest(2, '销售额')) # 分组后筛选(如只保留组内记录数大于5的组) result = df.groupby('地区').filter(lambda x: len(x) > 5)

完整代码示例

import pandas as pd # 读取销售数据 df = pd.read_csv('sales.csv') # ===== 单维度分组 ===== print("=== 各地区的销售总额 ===") region_sales = df.groupby('地区')['销售额'].sum() print(region_sales) print("\n=== 各产品类别的平均利润 ===") category_profit = df.groupby('产品类别')['利润'].mean() print(category_profit) # ===== 多维度分组 ===== print("\n=== 各地区各产品类别的销售总额 ===") region_category = df.groupby(['地区', '产品类别'])['销售额'].sum().reset_index() print(region_category) # ===== 多聚合函数 ===== print("\n=== 各地区的销售额统计 ===") region_stats = df.groupby('地区')['销售额'].agg(['sum', 'mean', 'count', 'max']) print(region_stats) # ===== agg自定义聚合 ===== print("\n=== 各地区多指标汇总 ===") region_summary = df.groupby('地区').agg({ '销售额': ['sum', 'mean'], '利润': 'sum', '订单号': 'count' }) print(region_summary) # 简化列名 region_summary.columns = ['销售总额', '平均销售额', '总利润', '订单数'] print(region_summary) # ===== 分组排序 ===== print("\n=== 销售额最高的地区(Top 3) ===") top_regions = df.groupby('地区')['销售额'].sum().sort_values(ascending=False).head(3) print(top_regions)

实操步骤

  1. 读取sales.csv,用 df.head() 查看数据结构
  2. 按"地区"分组,计算各地区的销售总额(groupby + sum)
  3. 按"产品类别"分组,计算各类别的平均利润(groupby + mean)
  4. 按"地区+产品类别"多列分组,计算销售总额(groupby([...]))
  5. 对"地区"分组后,用 agg() 同时计算销售额的总和、均值、最大值
  6. 用 agg() 对不同列应用不同函数:销售额求和、利润求均值、订单号计数
  7. 对分组结果按销售额降序排列(sort_values(ascending=False))
  8. 找出销售额最高的前3个地区

配套数据集:sales.csv

订单号,地区,产品类别,销售额,利润 S001,华南,电子产品,3500,700 S002,华北,服装,1200,300 S003,华南,服装,1800,450 S004,华东,电子产品,4200,840 S005,华北,食品,800,160 S006,华东,服装,2100,525 S007,华南,食品,1500,300 S008,华北,电子产品,3800,760 S009,华东,食品,1100,220 S010,华南,电子产品,2900,580 S011,华北,服装,1600,400 S012,华东,电子产品,5100,1020 S013,华南,服装,2200,550 S014,华北,食品,900,180 S015,华东,服装,1900,475

练习1:基础 groupby 分组聚合

使用 groupby 按"地区"分组,计算每个地区的销售额总和。请先创建 sales.csv 数据(已提供),然后用 df.groupby('地区')['销售额'].sum() 完成计算。

main.py
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案

练习2:多列分组和自定义聚合函数 agg()

按"地区"和"产品类别"两个维度分组,使用 agg() 对销售额求和、对利润求平均值。提示:使用 df.groupby(['地区', '产品类别']).agg({'销售额': 'sum', '利润': 'mean'})。

main.py
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案

练习3:分组后应用不同聚合函数

按"地区"分组,对销售额同时应用 sum、mean、max、min 四种聚合函数。然后尝试用自定义列名的方式重写(如"总销售额"、"平均销售额"、"最大单笔")。

main.py
执行结果
点击 "运行代码" 按钮查看执行结果
参考答案

项目小结

本项目我们学习了数据分组与聚合分析的核心技能:

  • 用 groupby() 按指定列分组
  • 用 sum()、mean()、count()、max()、min() 做聚合计算
  • 用 groupby([列1, 列2]) 进行多维度分组
  • 用 agg() 对不同列应用不同聚合函数
  • 用 sort_values() 对分组结果排序
  • 用 reset_index() 将分组结果转为普通DataFrame

分组聚合是数据分析中最常用的操作之一,掌握它你就能轻松回答"每个类别的总和/平均值是多少"这类业务问题。

← 上一项目:数据筛选与查询 下一项目:数据合并与连接 →