Python案例解析——Pandas数据分组与重分组实战指南
目录导读
- 为什么需要数据分组与重分组?
- Pandas分组核心操作:groupby详解
- 案例1:销售数据按季度分组并聚合
- 案例2:多级索引后的重分组(unstack/stack)
- 案例3:自定义分组逻辑与重映射
- 常见问题与SEO优化技巧
为什么需要数据分组与重分组?
在数据分析中,原始数据往往杂乱无章。分组(grouping)能将数据按特定维度拆解,重分组(reshaping)则改变分组结构,两者结合可挖掘深层规律,某电商平台需要按月统计每个品类的销售额,再按季度重新聚合——这就是典型的分组→重分组场景。

问答环节
Q:分组和重分组有什么区别?
A:分组是“分蛋糕”——将数据按类别切开;重分组是“重新拼蛋糕”——改变切块方式,比如将按月的分组结果合并为按季度。
Pandas分组核心操作:groupby详解
Pandas的groupby是分组的灵魂,支持三种模式:
- 按列名分组:
df.groupby('日期') - 按函数分组:
df.groupby(lambda x: x%2)(按索引奇偶) - 按字典/Series映射:
df.groupby({'A':'group1','B':'group2'})
重分组则依赖pivot_table、crosstab、stack/unstack等方法,其中unstack能将行索引转为列标题,实现“行列互换式重组”。
代码示例
import pandas as pd
df = pd.DataFrame({'日期':['2023-01','2023-02','2023-03'],
'销售额':[100,200,150]})
# 分组后unstack转换
grouped = df.groupby('日期')['销售额'].sum().unstack()
print(grouped)
注意:若分组字段唯一,unstack会生成Series而非DataFrame,需用reset_index调整。
案例1:销售数据按季度分组并聚合
数据准备
假设有一份全国门店销售数据,包含日期、门店、品类、金额四列。
实现步骤
- 将日期转换为季度:
df['季度'] = df['日期'].dt.quarter - 按门店+季度分组:
df.groupby(['门店','季度'])['金额'].sum() - 重分组为宽表:
grouped.unstack('季度')(每个季度变成一列)
完整代码
df['季度'] = pd.to_datetime(df['日期']).dt.quarter pivot = df.groupby(['门店','季度'])['金额'].sum().unstack(fill_value=0) # 添加合计行 pivot['合计'] = pivot.sum(axis=1)
结果中每行是一家门店,每列是Q1-Q4,极大简化了跨季度比较。
问答环节
Q:为什么用unstack而不是pivot_table?
A:unstack适合处理已存在多级索引的数据,代码更简洁;pivot_table适合直接指定行列值,但需额外参数,性能上unstack略快。
案例2:多级索引后的重分组(unstack/stack)
多级索引(MultiIndex)是分组后的常见产物,但直接查看不便,重分组能将其拆解。
场景:按年份和月份分组后,希望将月份作为列轴。
操作
grouped = df.groupby(['年份','月份'])['金额'].sum()
# 重排列:年份为行,月份为列
result = grouped.unstack('月份')
# 如需恢复为长格式,用stack
long_format = result.stack()
注意:stack会将列索引“压缩”为行索引,实现逆操作。
技巧:使用swaplevel可以交换索引层级顺序,配合sort_index保持整洁。
案例3:自定义分组逻辑与重映射
当分组规则非标准时(例如按金额区间分组),需自定义函数。
场景:将用户按消费金额分为高、中、低三档,再按档位统计购买频次。
实现
def money_bin(x):
if x < 100: return '低'
elif x < 500: return '中'
else: return '高'
df['档位'] = df['金额'].apply(money_bin)
grouped = df.groupby(['档位','用户ID']).size().unstack('档位',fill_value=0)
这里unstack将“档位”列变为多列,每列是特定档位的购买次数。
重分组扩展:若需将结果表再按“高消费用户占比”排序,可用grouped.div(grouped.sum(axis=1), axis=0)计算百分比。
常见问题与SEO优化技巧
问题1:分组后数据丢失
- 原因:
groupby默认丢弃NaN值 - 解决:加
dropna=False参数,如df.groupby('列名', dropna=False)
问题2:重分组后列名混乱
- 原因:
unstack默认以原分组值为列名 - 解决:用
reset_index或rename_axis调整,例如result.rename_axis(None, axis=1)
SEO优化建议
- 关键词布局、H2、H3及首段多次自然出现“Pandas数据分组 重分组”“Python分组案例”
- 代码格式化:使用
code标签或Markdown代码块,提升爬虫可读性 - 内外链:锚文本链接到Pandas官方文档(避免直出域名,建议写“Pandas官方API”)
- 经验丰富型内容:每段配实操代码,增加“问答”模块,符合Google E-E-A-T标准
文章建议:中后期加入“大数据场景性能优化”,例如用agg代替多次sum,或使用cudf加速GPU分组。
写在最后:数据分组与重分组是数据清洗和报表自动化的基石,掌握
groupby + unstack/stack组合,80%的分组需求都能迎刃而解,实际项目中,建议先用df.info()检查数据类型,再按“分组-聚合-重分组”三步走,避免索引错乱。