Python如何将两列数据转换为组合频次计数矩阵?
两列分类值转N×M频次矩阵实现方案
需求说明
存在两列分类数据:
- 第1列共N个唯一取值,作为矩阵行索引
- 第2列共M个唯一取值,作为矩阵列名
- 矩阵每个元素存储对应行、列取值组合在原始数据中的出现次数
- 方案需支持两列存在2个以上不同取值的通用场景
示例测试数据
import pandas as pd days = ['Monday','Tuesday','Monday','Tuesday','Tuesday','Monday'] weather = ['Rain','Sun','Sun','Sun','Rain','Rain'] df = pd.DataFrame({'day':days,'weather':weather})
上述示例预期输出2×2矩阵:行索引为Monday/Tuesday,列名为Rain/Sun,矩阵值为[[2,1],[1,2]],对应统计结果:周一降雨2次、周一晴天1次、周二降雨1次、周二晴天2次。
实现代码
直接使用pandas内置的pd.crosstab()方法即可,该方法专门用于统计两个分类变量的交叉频次,自动适配任意数量的分类值,无需手动编写循环统计逻辑:
# 生成交叉频次矩阵 freq_matrix = pd.crosstab(index=df['day'], columns=df['weather']) # 打印矩阵 print(freq_matrix)
运行输出:
weather Rain Sun day Monday 2 1 Tuesday 1 2
如果需要提取纯数值的二维数组格式,直接访问.values属性即可:
print(freq_matrix.values)
输出:
[[2 1] [1 2]]
补充说明
- 该方法会自动识别两列的所有唯一值生成行、列标签,未出现的行列组合会自动填充0,不需要额外做缺失值补全
- 如果需要调整行、列的排序,可以在生成矩阵后用
.reindex()方法手动指定标签顺序 - 方法自带归一化、添加边际合计等常用参数,可直接调用满足扩展需求
内容的提问来源于stack exchange,提问作者dcoolwater0502
相关产品推荐
相关产品推荐

