我的知识记录

Python Excel数据透视表 pandas实现

用pandas的pivot_table实现Excel数据透视表效果,按行按列分组、求和/计数/平均值,支持多级行列,导出成新Excel。

场景痛点

一份销售明细,要按"地区×月份"看各产品的销售额汇总,还要看订单数。Excel里拖字段做透视表,每次数据更新都得重做一遍。用pandas的 pivot_table 写好公式,刷新数据跑一下就出新结果。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def pivot_demo():
df = pd.read_excel("./销售明细.xlsx")

# 1. 单维度透视:按地区汇总销售额总和
p1 = pd.pivot_table(df, index="地区", values="金额",
aggfunc="sum", margins=True, margins_name="合计")

# 2. 二维透视:行=地区,列=月份,值=金额求和
p2 = pd.pivot_table(df, index="地区", columns="月份",
values="金额", aggfunc="sum", fill_value=0, margins=True)

# 3. 多个聚合:同时看金额总和 + 订单笔数
p3 = pd.pivot_table(df, index="地区", columns="产品",
values="订单号", aggfunc=["sum", "count"], fill_value=0)
# 注意:count是数订单号个数;sum金额要把values改成"金额"

# 4. 多级行:行=地区+产品,值=金额求和
p4 = pd.pivot_table(df, index=["地区", "产品"], values="金额",
aggfunc="sum", fill_value=0)

with pd.ExcelWriter("./透视结果.xlsx", engine="openpyxl") as writer:
p1.to_excel(writer, sheet_name="按地区求和")
p2.to_excel(writer, sheet_name="地区×月份")
p3.to_excel(writer, sheet_name="金额汇总+订单数")
p4.to_excel(writer, sheet_name="地区+产品")

print("透视表已生成: ./透视结果.xlsx")

if __name__ == "__main__":
pivot_demo()

代码讲解

  • index 对应透视表的行字段,columns 对应列字段,values 是要汇总的数值列。
  • aggfunc="sum" 求和;换成 "count" 计数、"mean" 平均值、"max" 最大值。
  • margins=True 自动加一行/列"合计",margins_name 自定义合计行名字。
  • fill_value=0 把空单元格填0,避免导出后出现空白。
  • index=["地区","产品"] 多级行,行字段嵌套。

运行结果

生成 透视结果.xlsx,4个sheet分别是不同维度的透视表,行是分类、列是月份/产品、值是汇总金额。

注意事项

  • pivot_table 默认会自动排序索引,想要保持原顺序先用 pd.Categorical 固定顺序。
  • 数值列如果混入文本,sum 会跳过并报警告,先用 pd.to_numeric(df["金额"], errors="coerce") 清洗。
  • 多级索引导出Excel后,行头会合并单元格,阅读体验和Excel原生透视表一致。

Python Excel数据透视表 pandas实现

标签:

更新时间:2026-09-15 09:04:34

上一篇:Python Excel设置打印区域页眉页脚:打印前一键排版

下一篇:Python Excel数字格式化:金额千分位与百分比设置