Python脚本实现一键生成多维度Pivot Table报告
场景引入
销售总监每个月都要看多维度的业绩报告:按地区汇总、按产品类别汇总、按销售员汇总。在 Excel 中手动创建数据透视表需要:选择数据 → 插入透视表 → 拖拽字段到行/列/值区域 → 设置计算方式 → 调整格式。每次都要重复这一套操作。
本节教你用 Python 一行代码创建数据透视表,效率提升 100 倍。
技术原理
pandas 的 pivot_table() 函数是 Excel 数据透视表的完美替代:
原始数据(10000 行销售记录)
↓
pivot_table(
values='销售额', # 汇总什么
index='地区', # 按什么分组(行)
columns='产品类别', # 按什么展开(列)
aggfunc='sum' # 怎么计算
)
↓
透视表结果
电子产品 服装 食品 总计
华东 500万 300万 200万 1000万
华北 350万 250万 180万 780万
华南 420万 280万 220万 920万
常用聚合函数
| aggfunc | 说明 | 适用场景 |
|---|---|---|
'sum' | 求和 | 汇总销售额/数量 |
'mean' | 平均值 | 平均客单价 |
'count' | 计数 | 订单数量统计 |
'max' / 'min' | 最大/最小值 | 极值分析 |
'std' | 标准差 | 波动分析 |
['sum', 'mean', 'count'] | 多指标 | 综合分析 |
环境准备
pip install pandas openpyxl
完整代码
import pandas as pd
def create_pivot_report(input_file, values, index, columns=None, aggfunc='sum', output_file="透视表报告.xlsx"):
"""
一键生成数据透视表报告
参数:
input_file: 原始数据文件
values: 要汇总的列(值字段),如 '销售额'
index: 行分组列,如 '地区'(支持列表,如 ['地区', '城市'])
columns: 列展开字段(可选),如 '产品类别'
aggfunc: 聚合函数,'sum'/'mean'/'count' 或列表
output_file: 输出文件名
"""
# 1. 读取数据
df = pd.read_excel(input_file, engine='openpyxl')
print(f"原始数据: {len(df)} 行\n")
# 2. 创建透视表
pivot = pd.pivot_table(
df,
values=values,
index=index,
columns=columns,
aggfunc=aggfunc,
fill_value=0, # 空值填 0
margins=True, # 显示总计行/列
margins_name='合计' # 总计的名称
)
# 3. 导出为 Excel
pivot.to_excel(output_file, engine='openpyxl')
print(f"透视表已保存: {output_file}")
print("\n透视表预览:")
print(pivot)
return pivot
# ==================== 多维度透视表 ====================
def multi_dimension_pivot(input_file, output_file="多维度透视报告.xlsx"):
"""
一次性生成多个维度的透视表,放在同一个 Excel 的不同 Sheet 中
"""
df = pd.read_excel(input_file, engine='openpyxl')
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
# 1. 按地区汇总
pivot1 = pd.pivot_table(df, values='销售额', index='地区',
aggfunc='sum', margins=True, margins_name='合计')
pivot1.to_excel(writer, sheet_name='地区汇总')
# 2. 按产品类别汇总
pivot2 = pd.pivot_table(df, values='销售额', index='产品类别',
aggfunc='sum', margins=True, margins_name='合计')
pivot2.to_excel(writer, sheet_name='产品汇总')
# 3. 按销售员汇总
pivot3 = pd.pivot_table(df, values=['销售额', '订单数'], index='销售员',
aggfunc={'销售额': 'sum', '订单数': 'sum'},
margins=True, margins_name='合计')
pivot3.to_excel(writer, sheet_name='销售员汇总')
# 4. 地区 × 产品交叉透视
pivot4 = pd.pivot_table(df, values='销售额', index='地区',
columns='产品类别', aggfunc='sum',
fill_value=0, margins=True, margins_name='合计')
pivot4.to_excel(writer, sheet_name='地区×产品')
# 5. 月度趋势
if '月份' in df.columns:
pivot5 = pd.pivot_table(df, values='销售额', index='月份',
columns='地区', aggfunc='sum',
fill_value=0, margins=True, margins_name='合计')
pivot5.to_excel(writer, sheet_name='月度趋势')
print(f"多维度透视报告已保存: {output_file}")
# ==================== 使用示例 ====================
if __name__ == "__main__":
# ========== 示例 1:简单透视表 ==========
create_pivot_report(
input_file="销售明细表.xlsx",
values='销售额',
index='地区',
columns='产品类别',
aggfunc='sum',
output_file="地区×产品透视表.xlsx"
)
# ========== 示例 2:多维度报告 ==========
# multi_dimension_pivot("销售明细表.xlsx", "多维度透视报告.xlsx")
代码逐行解析
1. 创建透视表
pivot = pd.pivot_table(
df,
values='销售额', # 汇总的目标列
index='地区', # 按地区分行
columns='产品类别', # 按产品类别分列
aggfunc='sum', # 求和
fill_value=0, # 空值替换为 0
margins=True, # 添加合计行/列
margins_name='合计' # 合计的名称
)
这个调用等价于 Excel 中:
- 行区域拖入"地区"
- 列区域拖入"产品类别"
- 值区域拖入"销售额",设置为"求和"
- 勾选"总计"
2. 多指标透视
aggfunc={'销售额': 'sum', '订单数': 'count'}
不同的值字段可以指定不同的聚合函数。
3. 多层行索引
index=['地区', '城市']
会生成层级结构的透视表:
地区 | 城市 | 销售额
--------|---------|--------
华东 | 上海 | 500万
| 南京 | 300万
| 杭州 | 400万
华北 | 北京 | 600万
| 天津 | 200万
进阶技巧
技巧 1:自定义聚合函数
# 计算转化率 = 成交数 / 访问数
def conversion_rate(x):
return x.sum() / len(x) * 100
pivot = pd.pivot_table(df, values='是否成交', index='渠道', aggfunc=conversion_rate)
技巧 2:透视后排序
# 按销售额降序排列
pivot = pivot.sort_values('销售额', ascending=False)
技巧 3:透视 + 可视化
# 直接用 pandas 画图
pivot.plot(kind='bar', figsize=(10, 6))
import matplotlib.pyplot as plt
plt.tight_layout()
plt.savefig('透视图.png')
常见问题
Q1:报错ValueError: No numeric types to aggregate
原因:values 列不是数值类型(可能是文本或混入了非数字)。
解决:
df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce')
Q2:透视表结果和 Excel 手动做的不一致?
原因:Excel 默认去重计数,pandas 的 count 统计所有非空值(含重复)。
解决:
# 去重计数
pivot = df.groupby('地区')['客户'].nunique().reset_index(name='客户数')
Q3:如何透视文本数据?
# 文本列使用计数或连接 pivot = pd.pivot_table(df, index='地区', values='备注', aggfunc=lambda x: ', '.join(x.dropna().unique()))
总结
| 参数 | 说明 | Excel 对应 |
|---|---|---|
values | 汇总的列 | 值区域 |
index | 行分组 | 行区域 |
columns | 列展开 | 列区域 |
aggfunc | 聚合方式 | 值字段设置 |
margins | 是否显示合计 | 总计开关 |
fill_value | 空值替换 | 显示为空单元格 |
本节掌握了 Python 版数据透视表,一行代码替代 Excel 中的多步操作,且支持批量生成多维度报告。
以上就是Python脚本实现一键生成多维度Pivot Table报告的详细内容,更多关于Python生成多维度透视表的资料请关注脚本之家其它相关文章!
相关文章
Python mlxtend库数据科学和机器学习补充工具功能探索
这篇文章主要介绍了Python mlxtend库数据科学和机器学习补充工具功能探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01
win10安装tensorflow-gpu1.8.0详细完整步骤
这篇文章主要介绍了win10安装tensorflow-gpu1.8.0详细完整步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2020-01-01
python结合shell自动创建kafka的连接器实战教程
这篇文章主要介绍了python结合shell自动创建kafka的连接器,需要安装连接oracle的python包,获取oracle表信息,本文给大家介绍的非常详细,需要的朋友可以参考下2022-04-04


最新评论