Python案例如何用Pandas做数据分组重分组

wen python案例 2

Python案例解析——Pandas数据分组与重分组实战指南

目录导读

  1. 为什么需要数据分组与重分组?
  2. Pandas分组核心操作:groupby详解
  3. 案例1:销售数据按季度分组并聚合
  4. 案例2:多级索引后的重分组(unstack/stack)
  5. 案例3:自定义分组逻辑与重映射
  6. 常见问题与SEO优化技巧

为什么需要数据分组与重分组?

在数据分析中,原始数据往往杂乱无章。分组(grouping)能将数据按特定维度拆解,重分组(reshaping)则改变分组结构,两者结合可挖掘深层规律,某电商平台需要按月统计每个品类的销售额,再按季度重新聚合——这就是典型的分组→重分组场景。

Python案例如何用Pandas做数据分组重分组

问答环节
Q:分组和重分组有什么区别?
A:分组是“分蛋糕”——将数据按类别切开;重分组是“重新拼蛋糕”——改变切块方式,比如将按月的分组结果合并为按季度。


Pandas分组核心操作:groupby详解

Pandas的groupby是分组的灵魂,支持三种模式:

  • 按列名分组df.groupby('日期')
  • 按函数分组df.groupby(lambda x: x%2)(按索引奇偶)
  • 按字典/Series映射df.groupby({'A':'group1','B':'group2'})

重分组则依赖pivot_tablecrosstabstack/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:销售数据按季度分组并聚合

数据准备
假设有一份全国门店销售数据,包含日期门店品类金额四列。

实现步骤

  1. 将日期转换为季度:df['季度'] = df['日期'].dt.quarter
  2. 按门店+季度分组:df.groupby(['门店','季度'])['金额'].sum()
  3. 重分组为宽表: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_indexrename_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()检查数据类型,再按“分组-聚合-重分组”三步走,避免索引错乱。

抱歉,评论功能暂时关闭!