Pandas 中透视表(`pivot_table`)和交叉表(`crosstab`)的区别
Pandas 中透视表(pivot_table
)和交叉表(crosstab
)的区别
核心区别
-
透视表 (
pivot_table
)- 用于对数据进行 聚合计算(如求和、均值、计数等)。
- 支持多维度分组(行、列、甚至多层索引)。
- 可以指定
values
(要聚合的值)和aggfunc
(聚合函数)。
-
交叉表 (
crosstab
)- 专门用于 计算频率分布(即列联表,统计不同组合的出现次数)。
- 默认行为是计数,但也可通过参数自定义聚合函数。
- 语法更简洁,适合快速生成两个变量的交叉统计。
代码示例与逐行注释
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'区域': ['北区', '北区', '南区', '南区', '东区', '西区', '西区'],
'产品类别': ['电子', '服装', '电子', '食品', '服装', '电子', '食品'],
'销售额': [200, 150, 300, 80, 120, 250, 90],
'季度': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q3', 'Q3']
}
df = pd.DataFrame(data)
# 使用透视表 (pivot_table)
# 目标:按区域和产品类别汇总销售额总和
pivot = pd.pivot_table(
df,
values='销售额', # 要聚合的数值列
index='区域', # 行分组键
columns='产品类别', # 列分组键
aggfunc=np.sum, # 聚合函数(默认是均值)
fill_value=0 # 缺失值填充为0
)
print("透视表结果:")
print(pivot)
# 使用交叉表 (crosstab)
# 目标:统计区域和产品类别的组合出现次数
crosstab = pd.crosstab(
index=df['区域'], # 行分类变量
columns=df['产品类别'], # 列分类变量
margins=True, # 显示总计
margins_name='总计' # 总计列的名称
)
print("\n交叉表结果:")
print(crosstab)
# 交叉表进阶:结合销售额求和(自定义聚合)
crosstab_agg = pd.crosstab(
index=df['区域'],
columns=df['产品类别'],
values=df['销售额'], # 指定要聚合的值
aggfunc=np.sum, # 聚合函数
dropna=False
)
print("\n交叉表(销售额求和):")
print(crosstab_agg)
输出结果解析
-
透视表输出
按区域和产品类别对销售额
进行求和:产品类别 电子 服装 食品 区域 东区 0 120 0 北区 200 150 0 南区 300 0 80 西区 250 0 90
-
交叉表(默认计数)
统计区域和产品类别的组合出现次数:产品类别 电子 服装 食品 总计 区域 东区 0 1 0 1 北区 1 1 0 2 南区 1 0 1 2 西区 1 0 1 2 总计 3 2 2 7
-
交叉表(销售额求和)
按区域和产品类别对销售额
求和:产品类别 电子 服装 食品 区域 东区 NaN 120.0 NaN 北区 200.0 150.0 NaN 南区 300.0 NaN 80.0 西区 250.0 NaN 90.0
关键参数对比
功能 | 透视表 (pivot_table ) | 交叉表 (crosstab ) |
---|---|---|
主要用途 | 多维度聚合计算 | 频率分布统计(列联表) |
默认聚合 | 均值 (aggfunc='mean' ) | 计数 (aggfunc='count' ) |
多维支持 | 支持多行、多列、多层索引 | 通常用于两个变量的交叉 |
填充缺失值 | fill_value 参数 | 无直接参数,可通过 dropna 控制显示 |
语法简洁性 | 较复杂,需明确指定 values 和 aggfunc | 更简洁,适合快速生成频率表 |
通过选择合适的方法,可以高效实现数据汇总或分布统计的需求!