查看: 133|回复: 3

Python pandas pivot_table 实战:一键生成多维度销售统计报告

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在销售数据分析中,经常需要按地区、产品、销售员等多维度汇总销售额、订单数等指标。Excel 数据透视表虽然直观,但每次都要手动拖拽字段并重复操作。利用 Python 的 pandas 库提供的 pivot_table() 函数,可以一行代码生成与 Excel 透视表等效的汇总结果,并支持批量导出为包含多个 sheet 的 Excel 文件。本文通过完整代码和参数解析,演示如何用 Python 脚本实现自动化多维度报表生成。

环境准备
安装依赖库:
  1. pip install pandas openpyxl
复制代码

核心函数:单维度透视表
以下函数读取 Excel 源文件,根据指定的行索引、列索引、值字段和聚合方式生成透视表,并自动添加合计行/列。
  1. import pandas as pd
  2. def create_pivot_report(input_file, values, index, columns=None, aggfunc='sum', output_file="透视表报告.xlsx"):
  3.     """
  4.     生成一张透视表并导出为 Excel
  5.     参数说明:
  6.         input_file: 源数据 Excel 路径
  7.         values: 要汇总的数值列名,如 '销售额'
  8.         index: 行分组列名(支持列表,如 ['地区','城市'])
  9.         columns: 列展开字段(可选),如 '产品类别'
  10.         aggfunc: 聚合函数,'sum','mean','count','std' 或函数列表
  11.         output_file: 输出 Excel 文件名
  12.     """
  13.     df = pd.read_excel(input_file, engine='openpyxl')
  14.     pivot = pd.pivot_table(
  15.         df,
  16.         values=values,
  17.         index=index,
  18.         columns=columns,
  19.         aggfunc=aggfunc,
  20.         fill_value=0,          # 空值填 0
  21.         margins=True,          # 显示总计行/列
  22.         margins_name='合计'     # 总计名称
  23.     )
  24.     pivot.to_excel(output_file, engine='openpyxl')
  25.     print(f"透视表已保存: {output_file}")
  26.     return pivot
复制代码
参数等价 Excel 操作:values → 值区域;index → 行区域;columns → 列区域;aggfunc → 值字段设置(求和、平均值等);margins → 总计开关;fill_value → 空单元格填充。

批量生成多维度报告
有时需要一次输出多个透视表(如按地区、按产品、按销售员、交叉维度、月度趋势),并将其放入同一个 Excel 的不同 sheet 中,方便对比。下面函数利用 pd.ExcelWriter 实现这一需求。
  1. def multi_dimension_pivot(input_file, output_file="多维度透视报告.xlsx"):
  2.     df = pd.read_excel(input_file, engine='openpyxl')
  3.     with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
  4.         # 1. 按地区汇总
  5.         pivot1 = pd.pivot_table(df, values='销售额', index='地区', aggfunc='sum', margins=True, margins_name='合计')
  6.         pivot1.to_excel(writer, sheet_name='地区汇总')
  7.         # 2. 按产品类别汇总
  8.         pivot2 = pd.pivot_table(df, values='销售额', index='产品类别', aggfunc='sum', margins=True, margins_name='合计')
  9.         pivot2.to_excel(writer, sheet_name='产品汇总')
  10.         # 3. 按销售员汇总(双指标)
  11.         pivot3 = pd.pivot_table(df, values=['销售额', '订单数'], index='销售员',
  12.                                 aggfunc={'销售额': 'sum', '订单数': 'sum'}, margins=True, margins_name='合计')
  13.         pivot3.to_excel(writer, sheet_name='销售员汇总')
  14.         # 4. 地区 × 产品交叉透视
  15.         pivot4 = pd.pivot_table(df, values='销售额', index='地区', columns='产品类别', aggfunc='sum',
  16.                                 fill_value=0, margins=True, margins_name='合计')
  17.         pivot4.to_excel(writer, sheet_name='地区×产品')
  18.         # 5. 月度趋势(如果存在“月份”列)
  19.         if '月份' in df.columns:
  20.             pivot5 = pd.pivot_table(df, values='销售额', index='月份', columns='地区', aggfunc='sum',
  21.                                     fill_value=0, margins=True, margins_name='合计')
  22.             pivot5.to_excel(writer, sheet_name='月度趋势')
  23.     print(f"多维度透视报告已保存: {output_file}")
复制代码
使用示例:
  1. if __name__ == "__main__":
  2.     # 简单透视表(按地区×产品交叉汇总销售额)
  3.     create_pivot_report("销售明细表.xlsx", values='销售额', index='地区', columns='产品类别', aggfunc='sum')
  4.     # 批量多维度报告
  5.     # multi_dimension_pivot("销售明细表.xlsx")
复制代码

进阶技巧
1. 自定义聚合函数(如计算转化率)
  1. def conversion_rate(x):
  2.     return x.sum() / len(x) * 100
  3. pivot = pd.pivot_table(df, values='是否成交', index='渠道', aggfunc=conversion_rate)
复制代码
2. 透视后排序
  1. pivot = pivot.sort_values('销售额', ascending=False)
复制代码
3. 透视后直接可视化
  1. pivot.plot(kind='bar', figsize=(10, 6))
  2. import matplotlib.pyplot as plt
  3. plt.tight_layout()
  4. plt.savefig('透视图.png')
复制代码

常见问题与排查
Q1: ValueError: No numeric types to aggregate
原因: values 列中存在非数值类型(如文本或混合类型)。
解决: 先转换为数值,无效值转为 NaN:
  1. df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce')
复制代码
Q2: 透视表结果与 Excel 手动做的不一致?
Excel 的“计数”默认是去重计数(统计唯一值),而 pandas 的 aggfunc='count' 统计所有非空行(含重复)。如需去重计数,使用 groupby + nunique:
  1. pivot = df.groupby('地区')['客户'].nunique().reset_index(name='客户数')
复制代码
Q3: 如何透视文本数据?
对于文本列,不能直接求和/平均,但可以用计数或连接:
  1. pivot = pd.pivot_table(df, index='地区', values='备注', aggfunc=lambda x: ', '.join(x.dropna().unique()))
复制代码

总结
pandas 的 pivot_table 参数与 Excel 透视表控件一一对应,且支持通过 Python 脚本批量生成多维度、多 sheet 的复杂报告。掌握此工具后,可大幅减少手动重复劳动,适合日常数据分析与报表自动化场景。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python pandas pivot_table 实战:一键生成多维度销售统计报告

很实用的分享!pivot_table 确实是把 Excel 透视表搬到 Python 的利器,你代码里把参数和 Excel 对应起来解释得很清楚,对刚接触 pandas 的同学特别友好。尤其是那个 `multi_dimension_pivot` 函数,一次性输出多 sheet 的场景太常见了,之前我都是手动调多次 `to_excel`,用 `ExcelWriter` 确实方便很多。 想问一下,当源数据量比较大(比如几十万行)的时候,`margins=True` 加上多级索引会不会明显拖慢速度?还有,如果需要对同一个 `values` 字段同时用 `sum` 和 `count` 两种聚合,除了像你那样传字典,是不是也可以传一个 `['sum','count']` 列表?我试过一次,结果会额外生成多级列名,但不太确定哪种写法更规范。期待后续还能看到结合 `groupby` 和 `pivot_table` 的对比分析。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python pandas pivot_table 实战:一键生成多维度销售统计报告

感谢楼主分享!这篇教程非常实用,代码清晰,注释详尽,特别是 `multi_dimension_pivot` 函数把多个透视表整合到一个 Excel 的不同 sheet 里,大大减少了重复操作。我平时也经常用 pivot_table,但没想过用 `pd.ExcelWriter` 批量输出,学到了。问一个小问题:如果源数据里已经有日期列,是不是可以直接在 `index` 或 `columns` 里结合 `pd.Grouper(freq='M')` 做月聚合?还是必须先单独拆出月份列?期待楼主后续能补充一下时间维度处理的小技巧。再次感谢!
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python pandas pivot_table 实战:一键生成多维度销售统计报告

这个帖子太实用了!之前用 Excel 做透视表每次都要手动拖拽,重复操作确实麻烦。用 pandas 的 `pivot_table` 配合 `ExcelWriter` 批量导出多个 sheet,正好解决了我的痛点。特别是 `fill_value=0` 和 `margins=True` 的默认配置,省去了手动处理空值和总计的步骤。另外,`aggfunc` 可以传字典对不同的值列用不同的聚合函数,这个细节很赞。建议后续可以加上对日期列自动按年月分组的演示,比如 `df['月份'] = df['日期'].dt.to_period('M')`,这样月度趋势就更通用了。感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-23 13:10 , Processed in 0.029815 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部