在数据分析场景中,分类变量的频次统计和交叉汇总表生成是基础且高频的操作,Pandas作为Python生态中最常用的数据处理库,提供了多个工具可以高效完成这类任务,不需要手动编写复杂的循环逻辑。

分类变量频次统计基础方法
统计单个分类变量的频次,最常用的是value_counts方法,它可以直接对Series对象进行计数,默认按照频次降序排列,同时支持缺失值处理、归一化等扩展功能。
以下是基础的频次统计示例,假设我们有一份用户消费数据,包含用户所在城市和消费等级两个分类字段:
import pandas as pd
# 构造示例数据
data = {
"city": ["北京", "上海", "北京", "广州", "上海", "北京", "深圳", "广州", "深圳", "北京"],
"level": ["高", "中", "高", "低", "中", "中", "高", "低", "中", "高"]
}
df = pd.DataFrame(data)
# 统计城市字段的频次
city_freq = df["city"].value_counts()
print("城市频次统计结果:")
print(city_freq)
上述代码运行后,会输出每个城市出现的次数,北京出现4次,上海和广州各2次,深圳1次,结果默认按频次从高到低排列。
如果需要统计频次的同时计算占比,可以设置normalize=True参数:
# 统计城市频次的占比
city_freq_rate = df["city"].value_counts(normalize=True)
print("城市频次占比结果:")
print(city_freq_rate)
生成交叉汇总表的核心方法
交叉汇总表需要同时统计两个或多个分类变量的组合频次,Pandas提供了crosstab和pivot_table两个核心函数来实现,两者的适用场景略有区别。
使用crosstab生成交叉表
crosstab是专门用于生成交叉频次的工具,语法更简洁,适合快速统计两个分类变量的组合分布:
# 生成城市和消费等级的交叉汇总表
cross_table = pd.crosstab(index=df["city"], columns=df["level"])
print("城市和消费等级交叉表:")
print(cross_table)
上述代码会生成一个以城市为行、消费等级为列的交叉表,每个单元格的值是对应的组合出现次数,比如北京和高等级的组合出现了3次。
如果需要给交叉表添加行总计和列总计,可以设置margins=True参数:
# 带总计的交叉表
cross_table_with_margin = pd.crosstab(index=df["city"], columns=df["level"], margins=True, margins_name="总计")
print("带总计的交叉表:")
print(cross_table_with_margin)
使用pivot_table生成交叉表
pivot_table的功能更通用,除了统计频次,还可以计算均值、求和等聚合指标,当需要基于现有数据列做聚合时更适用:
# 使用pivot_table生成交叉频次表,需要指定aggfunc为计数
pivot_cross_table = df.pivot_table(index="city", columns="level", aggfunc="size", fill_value=0)
print("pivot_table生成的交叉表:")
print(pivot_cross_table)
这里aggfunc="size"表示统计每个组合的行数,fill_value=0表示将缺失的组合填充为0,避免结果中出现NaN值。
两种方法的选择建议
如果是单纯统计两个分类变量的组合频次,优先选择crosstab,语法更简洁,不需要额外指定聚合逻辑;如果除了频次之外还需要计算其他聚合指标,或者交叉表的维度来自数据的原有列,更适合使用pivot_table。
以下是两种方法的简单对比:
| 对比维度 | crosstab | pivot_table |
|---|---|---|
| 适用场景 | 纯分类变量交叉频次统计 | 通用聚合场景,支持多类型聚合函数 |
| 语法复杂度 | 低,参数更聚焦交叉统计 | 稍高,需要指定聚合函数 |
| 缺失值处理 | 默认不显示缺失组合 | 可通过fill_value参数填充 |
实操注意事项
在处理实际数据时,需要注意分类变量中是否存在缺失值,value_counts默认不会统计NaN值,如果需要统计缺失值频次,可以设置dropna=False。另外交叉表的行和列顺序可以通过sort参数调整,默认会按照分类值的字母顺序排列,也可以手动指定顺序:
# 指定交叉表的行和列顺序
city_order = ["北京", "上海", "广州", "深圳"]
level_order = ["高", "中", "低"]
ordered_cross_table = pd.crosstab(
index=df["city"],
columns=df["level"],
rownames=["城市"],
colnames=["消费等级"]
).reindex(index=city_order, columns=level_order, fill_value=0)
print("指定顺序后的交叉表:")
print(ordered_cross_table)
通过上述方法,就可以高效完成分类变量的频次统计和交叉汇总表的重构,满足日常数据分析中的各类需求。
Pandas分类变量频次统计交叉汇总表pivot_tablecrosstab修改时间:2026-07-14 23:09:34