python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python生成多维度透视表

Python脚本实现一键生成多维度Pivot Table报告

作者:小庄-Python办公

这篇文章主要为大家详细介绍了如何使用Python的pandas库实现Excel数据透视表的自动化生成,大幅提升工作效率,有需要的小伙伴可以跟随小编一起学习一下

场景引入

销售总监每个月都要看多维度的业绩报告:按地区汇总、按产品类别汇总、按销售员汇总。在 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 中:

  1. 行区域拖入"地区"
  2. 列区域拖入"产品类别"
  3. 值区域拖入"销售额",设置为"求和"
  4. 勾选"总计"

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生成多维度透视表的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文