自学教程 学编程从这里开始

Pandas 透视表 pivot_table

承接《Pandas expanding / ewm 窗口详解》,本篇讲解 pivot_table 透视表,和 pivot 做对比,包含基础用法、聚合函数、多维度、边距汇总、填充空值、分组筛选、多层透视、实战报表场景,是数据分析、业务汇总报表高频工具,保持系列教程统一风格。
前置导入与示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "region": ["华东","华东","华南","华南","华北","华北","华东","华南"],
    "cate": ["手机","电脑","手机","电脑","手机","电脑","手机","电脑"],
    "sale_date": ["2025-01-01","2025-01-01","2025-01-02","2025-01-02","2025-01-03","2025-01-03","2025-01-03","2025-01-03"],
    "sales": [1200, 800, 1500, 950, 1100, 780, 1350, 1020],
    "profit": [180, 120, 220, 140, 160, 110, 195, 150]
})
print(df)

一、pivot_table 核心说明

pivot_table:数据透视表,类似Excel透视表。

  • 自动分组 + 聚合,支持重复行合并统计
  • 支持多索引、多列、多值、多种聚合函数
  • 对比 pivot:pivot 只做重塑,不支持聚合,重复键直接报错;pivot_table 自带聚合,业务汇总优先用它。

基础语法:

pd.pivot_table(
    data,
    index=None,        # 行维度
    columns=None,      # 列维度
    values=None,       # 需要统计的数值字段
    aggfunc="mean",    # 聚合函数
    fill_value=None,   # 缺失填充值
    margins=False,     # 是否开启合计行/列
    margins_name="All" # 合计的名称
)

二、基础示例:单维度透视

按地区作为行,统计销售额均值

pt1 = pd.pivot_table(
    df,
    index="region",
    values="sales",
    aggfunc="mean"
)
print(pt1)

三、二维透视(行+列,最常用)

行:地区 region;列:品类 cate;值:sales,求和

pt2 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values="sales",
    aggfunc="sum"
)
print(pt2)

四、指定多个聚合函数

同时求总和、平均值、最大值

pt3 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values="sales",
    aggfunc=["sum", "mean", "max"]
)
print(pt3)

五、多个数值字段同时统计

sales 和 profit 一起汇总

pt4 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values=["sales", "profit"],
    aggfunc="sum"
)
print(pt4)

六、多行索引(多层行维度)

行维度:地区 + 日期,多层索引

pt5 = pd.pivot_table(
    df,
    index=["region", "sale_date"],
    columns="cate",
    values="sales",
    aggfunc="sum"
)
print(pt5)

七、margins 开启合计行、合计列

margins=True 自动增加总计行、总计列

pt6 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values="sales",
    aggfunc="sum",
    margins=True,
    margins_name="合计"
)
print(pt6)

八、fill_value 填充透视产生的空值

维度组合没有数据时,默认NaN,fill_value填充

pt7 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values="sales",
    aggfunc="sum",
    fill_value=0
)
print(pt7)

九、自定义聚合函数

aggfunc 可以传入自定义函数

def range_val(x):
    return x.max() - x.min()

pt8 = pd.pivot_table(
    df,
    index="region",
    columns="cate",
    values="sales",
    aggfunc=range_val
)
print(pt8)

十、pivot_table vs pivot 对比

函数聚合重复key适用场景
pivot_table✅ 支持aggfunc自动聚合业务报表、汇总统计(推荐)
pivot❌ 无聚合重复值直接报错数据规整、无重复的表格重塑

示例 pivot(仅重塑,不聚合)

# 仅适合组合唯一的场景
df.pivot(index="region", columns="cate", values="sales")

十一、透视表后常用操作

1. 重置索引,转为普通DataFrame(导出Excel常用)

pt = pd.pivot_table(df, index="region", columns="cate", values="sales", aggfunc="sum")
pt_reset = pt.reset_index()

2. 排序

pt.sort_values(by=("手机", "sum"), ascending=False)

3. 筛选维度

pt.loc["华东"]
pt["手机"]

十二、高频坑清单

  1. 原始数据存在重复 index+columns 组合,pivot 直接报错,改用 pivot_table
  2. margins合计是基于原始数据聚合,不是对透视出来的数字再求和,逻辑正确
  3. fill_value 只会填充透视后的NaN,不能处理原始数据缺失
  4. 多层行/列索引导出Excel可读性差,一般配合 reset_index 或者 flatten 表头
  5. aggfunc 多个函数时,会生成多层列索引,取值需要元组 pt[("sales","sum")]
  6. 时间维度建议先转datetime,再放入index,方便后续排序筛选

十三、综合实战模板(导出报表模板)

def create_sale_pivot(df):
    pt = pd.pivot_table(
        df,
        index="region",
        columns="cate",
        values=["sales","profit"],
        aggfunc="sum",
        fill_value=0,
        margins=True,
        margins_name="合计"
    )
    pt = pt.reset_index()
    return pt

report = create_sale_pivot(df)
print(report)
# report.to_excel("pivot_report.xlsx")

十四、速查表

参数作用
index行分组维度
columns列分组维度
values需要统计的数值列
aggfunc聚合函数 sum/mean/max/min/count
fill_value空白填充
margins开启合计行、合计列
margins_name合计标签名称
标签:

0 条笔记