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 | 更简洁,适合快速生成频率表 | 
通过选择合适的方法,可以高效实现数据汇总或分布统计的需求!
