项目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)
实操步骤
- 读取sales.csv,用
df.head()查看数据结构 - 按"地区"分组,计算各地区的销售总额(
groupby + sum) - 按"产品类别"分组,计算各类别的平均利润(
groupby + mean) - 按"地区+产品类别"多列分组,计算销售总额(
groupby([...])) - 对"地区"分组后,用
agg()同时计算销售额的总和、均值、最大值 - 用
agg()对不同列应用不同函数:销售额求和、利润求均值、订单号计数 - 对分组结果按销售额降序排列(
sort_values(ascending=False)) - 找出销售额最高的前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题
选择题
按地区分组并计算销售额总和,正确的写法是?
答案解析
groupby()是pandas分组的标准方法,注意没有下划线。
第2题
选择题
groupby后计算每组记录数量,应该用?
答案解析
size()和count()都可以计数。size()返回Series,count()对非空值计数。
第3题
选择题
同时对不同列应用不同的聚合函数,应该用?
答案解析
agg()(aggregate的缩写)可以对不同列应用不同的聚合函数,非常灵活。
第4题
判断题
df.groupby(['地区', '产品类别']) 是按两个维度同时分组。
答案解析
groupby传入列表,会按多个列的组合进行分组,形成多级索引。
第5题
填空题
对分组结果按销售额降序排列,应写为:df.groupby('地区')['销售额'].sum().sort_values(ascending=)
答案解析
ascending=False表示降序排列,ascending=True表示升序排列。
第6题
选择题
groupby后求平均值,应该用?
答案解析
pandas中求平均值用mean(),不是average()或avg()。median()是中位数。
第7题
选择题
以下哪个不是pandas的聚合函数?
答案解析
pandas中没有total()函数,求和用sum()。
0/7
项目小结
本项目我们学习了数据分组与聚合分析的核心技能:
- 用
groupby()按指定列分组 - 用
sum()、mean()、count()、max()、min()做聚合计算 - 用
groupby([列1, 列2])进行多维度分组 - 用
agg()对不同列应用不同聚合函数 - 用
sort_values()对分组结果排序 - 用
reset_index()将分组结果转为普通DataFrame
分组聚合是数据分析中最常用的操作之一,掌握它你就能轻松回答"每个类别的总和/平均值是多少"这类业务问题。