0Pricing
Pandas & NumPy Academy · 课时

pivot_table:交叉表

使用 pd.pivot_table 创建类似 Excel 的透视表,设置 index、columns、values 和 aggfunc。

pivot_table:交叉表 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

什么是数据透视表

数据透视表是一种交叉表,按照两个分类维度汇总数据——其中一个维度构成行,另一个构成列——并在每个单元格中填入聚合值。如果您曾在 Excel 中创建过数据透视表,就会立即理解这一概念。Pandas 提供了 pd.pivot_table()(以及对应的 DataFrame 方法版本),让您可以完全使用 Python 创建这类汇总表。

基本的 pivot_table 调用

pd.pivot_table() 的四个关键参数是:values(要聚合的列)、index(作为行的列)、columns(作为列的列)和 aggfunc(聚合函数,默认为 'mean')。结果是一个 DataFrame,其中每个单元格都包含对应行列组合的聚合值。

import pandas as pd

df = pd.DataFrame({
    'region':  ['East', 'West', 'East', 'West', 'East', 'West'],
    'product': ['A',    'A',    'B',    'B',    'A',    'B'],
    'revenue': [200,    340,    150,    290,    310,    410]
})

table = pd.pivot_table(df,
                       values='revenue',
                       index='region',
                       columns='product',
                       aggfunc='sum')
print(table)
# product    A    B
# region
# East     510  150
# West     340  700

选择 aggfunc

aggfunc 参数可以接受 NumPy/Pandas 聚合函数的字符串名称、可调用对象或可调用对象列表。常见选择包括:使用 'sum' 计算总和,使用 'mean' 计算平均值,使用 'count' 计算频数,使用 'min'/'max' 查找极值。传入列表时,每个聚合函数都会在列 MultiIndex 中占据自己的层级。

# Using mean (default)
table_mean = pd.pivot_table(df, values='revenue',
                            index='region', columns='product',
                            aggfunc='mean')
print(table_mean.round(1))
# product      A      B
# region
# East     255.0  150.0
# West     340.0  350.0

# Using count
table_count = pd.pivot_table(df, values='revenue',
                             index='region', columns='product',
                             aggfunc='count')
print(table_count)

使用 fill_value 处理缺失单元格

当行标签和列标签的某种组合没有数据时,该单元格默认包含 NaN。传入 fill_value 可以用有意义的默认值替换这些缺失单元格,例如在统计数量或收入时使用 0。这样可以让表格更易读,也能避免后续算术运算无提示地产生 NaN 结果。

df2 = pd.DataFrame({
    'region':  ['East', 'West', 'East'],
    'product': ['A',    'A',    'B'],
    'revenue': [200,    340,    150]
})

# West-B combination has no data -> NaN by default
table = pd.pivot_table(df2, values='revenue', index='region',
                       columns='product', aggfunc='sum', fill_value=0)
print(table)
# product    A    B
# region
# East     200  150
# West     340    0  <- filled with 0 instead of NaN

使用 margins 添加小计

传入 margins=True 可以将行总计和列总计添加到数据透视表中。Pandas 会在底部追加 'All' 行,并在右侧追加 'All' 列,其中包含所有类别的聚合值。您可以使用 margins_name 重命名总计标签。这对应于 Excel 数据透视表中的“总计”行。

table = pd.pivot_table(df, values='revenue', index='region',
                       columns='product', aggfunc='sum',
                       fill_value=0, margins=True, margins_name='Total')
print(table)
# product    A     B  Total
# region
# East     510   150    660
# West     340   700   1040
# Total    850   850   1700

pivot_table 中的多个值

values 参数可以接收列名列表,从而一次聚合多个指标。结果的列索引是 MultiIndex,其中外层是值列,内层是类别。这样,您可以通过一次调用创建完整的汇总表,而不必分别创建并合并多个数据透视表。

df['units'] = [10, 15, 8, 12, 14, 18]

table = pd.pivot_table(df,
                       values=['revenue', 'units'],
                       index='region',
                       columns='product',
                       aggfunc='sum')
print(table)
# Columns: (revenue, A), (revenue, B), (units, A), (units, B)
print(table.columns.tolist())

层次化索引和列

向 index 或 columns 传入列表时,数据透视表会在相应轴上使用 MultiIndex。这样可以创建更细致的汇总表——例如,在行方向按地区和季度拆分收入,在列方向按产品拆分。像往常一样,可以使用 .loc 和索引元组访问较低层级。

df['quarter'] = ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q2']

table = pd.pivot_table(df, values='revenue',
                       index=['region', 'quarter'],
                       columns='product',
                       aggfunc='sum', fill_value=0)
print(table)
# product         A    B
# region quarter
# East   Q1     510    0
#        Q2       0  150
# West   Q1     340    0
#        Q2       0  700

展开结果

创建数据透视表后,索引就是分组列;如果使用了多个值,列 MultiIndex 可能不便于使用。常见的整理方式是调用 reset_index() 展开行索引,然后使用列表推导式,以下划线连接各层级,将列 MultiIndex 合并为单层。

table = pd.pivot_table(df, values=['revenue', 'units'],
                       index='region', columns='product', aggfunc='sum')

# Flatten MultiIndex columns
table.columns = ['_'.join(str(c) for c in col) for col in table.columns]
table = table.reset_index()
print(table.columns.tolist())
# ['region', 'revenue_A', 'revenue_B', 'units_A', 'units_B']

pivot_table 与 groupby().agg()

pivot_table 和 groupby().agg() 都可以生成汇总统计数据。区别在于输出形状:groupby().agg() 返回长格式 DataFrame,每种分组组合占一行;而 pivot_table 返回宽格式表格,其中一个维度会变成列。对于仪表板和报告,数据透视表的宽格式通常更易读;对于后续的机器学习或统计分析,则更偏好长格式。

# Long format (groupby)
long = df.groupby(['region', 'product'])['revenue'].sum().reset_index()
print(long)
# region product  revenue
# East        A      510
# East        B      150

# Wide format (pivot_table)
wide = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)
print(wide)
# product    A    B
# region
# East     510  150

对数据透视表进行排序和设置样式

数据透视表就是普通的 DataFrame,因此您可以像处理其他 Pandas DataFrame 一样对其排序、计算派生列并设置格式。例如,可以按某个产品列降序排列,以根据该产品的表现对地区进行排名;也可以将每个单元格除以行总计,添加百分比列。

table = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)

# Sort by product A revenue descending
table_sorted = table.sort_values('A', ascending=False)
print(table_sorted)

# Add percentage of row total
table['A_pct'] = (table['A'] / table.sum(axis=1) * 100).round(1)
print(table)

实际应用:销售仪表板表格

数据透视表是构建管理报告和仪表板的核心工具。典型工作流是:加载原始交易数据,以月份为列、产品类别为行创建数据透视表,添加总计,然后导出到 Excel。从原始数据到适合会议室展示的表格,整个流程只需调用几次 Pandas 方法。

# Simulated monthly product revenue pivot
result = pd.pivot_table(
    df,
    values='revenue',
    index='product',
    columns='region',
    aggfunc='sum',
    fill_value=0,
    margins=True,
    margins_name='Grand Total'
)
print(result)
# Export to Excel
# result.to_excel('sales_pivot.xlsx')

快速检查

检验您对本课 pd.pivot_table 内容的理解。

课程回顾

在本课中,您学习了:pd.pivot_table() 可以创建交叉表汇总,将一个维度作为行、另一个维度作为列;fill_value 用于处理缺失单元格,margins=True 用于添加总计;您可以一次聚合多个值;数据透视表会生成非常适合报告的宽格式输出。接下来,我们将学习相反的操作:使用 melt() 将宽格式数据转换回长格式。

常见问题解答

「pivot_table:交叉表」课时是免费的吗?

是的 — 「pivot_table:交叉表」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「pivot_table:交叉表」这节课中我会学到什么?

使用 pd.pivot_table 创建类似 Excel 的透视表,设置 index、columns、values 和 aggfunc。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「pivot_table:交叉表」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. pivot_table:交叉表
  2. melt:从宽格式转换为长格式
  3. 使用 MultiIndex 进行 stack 和 unstack
  4. 使用 crosstab 创建频数表
← 返回 Pandas & NumPy Academy