首页 > 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
交互式练习题
0/7
第1题 选择题
按地区分组并计算销售额总和,正确的写法是?
A. df.group('地区')['销售额'].sum()
B. df.groupby('地区')['销售额'].sum()
C. df.groupby('地区').sum('销售额')
D. df.group_by('地区')['销售额'].sum()
答案解析

groupby()是pandas分组的标准方法,注意没有下划线。

第2题 选择题
groupby后计算每组记录数量,应该用?
A. size()
B. count()
C. length()
D. 以上都可以
答案解析

size()count()都可以计数。size()返回Series,count()对非空值计数。

第3题 选择题
同时对不同列应用不同的聚合函数,应该用?
A. apply()
B. transform()
C. agg()
D. map()
答案解析

agg()(aggregate的缩写)可以对不同列应用不同的聚合函数,非常灵活。

第4题 判断题
df.groupby(['地区', '产品类别']) 是按两个维度同时分组。
正确
错误
答案解析

groupby传入列表,会按多个列的组合进行分组,形成多级索引。

第5题 填空题
对分组结果按销售额降序排列,应写为:df.groupby('地区')['销售额'].sum().sort_values(ascending=)
答案解析

ascending=False表示降序排列,ascending=True表示升序排列。

第6题 选择题
groupby后求平均值,应该用?
A. average()
B. mean()
C. avg()
D. median()
答案解析

pandas中求平均值用mean(),不是average()avg()median()是中位数。

第7题 选择题
以下哪个不是pandas的聚合函数?
A. sum()
B. mean()
C. total()
D. max()
答案解析

pandas中没有total()函数,求和用sum()

0/7

项目小结

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

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

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

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