如何基于4列二元数据生成带多级索引的交叉表?
生成多列值组合的交叉统计表(Pandas实现)
问题背景
现有如下Pandas数据集:
import pandas as pd a = [[1,0,1,1], [1,1,0,0], [1,1,1,1], [1,1,1,1], [0,0,1,0], [0,1,0,0], [0,0,0,0], [1,0,0,1], [1,0,0,1], [0,1,0,1]] df = pd.DataFrame(a, columns=['A','B','C','D'])
数据集预览:
A B C D 0 1 0 1 1 1 1 1 0 0 2 1 1 1 1 3 1 1 1 1 4 0 0 1 0 5 0 1 0 0 6 0 0 0 0 7 1 0 0 1 8 1 0 0 1 9 0 1 0 1
需要生成一个多层索引的交叉表,统计每列(A/B/C/D)取1或0时,与其他列取1或0的组合出现次数,期望输出格式如下:
iterables = [["A", "B", "C", "D"], [1, 0]] index = pd.MultiIndex.from_product(iterables) op = [[0,0,3,3,3,3,0,0], [0,0,2,2,1,3,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,3,1], [0,0,0,0,0,0,3,3], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0]] print(pd.DataFrame(op, index=index, columns=index))
输出结果:
A B C D 1 0 1 0 1 0 1 0 A 1 0 0 3 3 3 3 0 0 0 0 0 2 2 1 3 0 0 B 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 C 1 0 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 D 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
尝试过pd.crosstab()但仅支持两列,透视表也未成功,需要可行的解决方案。
解决方案
通过遍历所有列的组合,统计对应值的共同出现次数,再填充到预定义的多层索引DataFrame中即可实现需求:
import pandas as pd # 原始数据 a = [[1,0,1,1], [1,1,0,0], [1,1,1,1], [1,1,1,1], [0,0,1,0], [0,1,0,0], [0,0,0,0], [1,0,0,1], [1,0,0,1], [0,1,0,1]] df = pd.DataFrame(a, columns=['A','B','C','D']) # 构建多层索引(行和列共用同一结构) iterables = [["A", "B", "C", "D"], [1, 0]] multi_index = pd.MultiIndex.from_product(iterables) # 初始化全0结果表 result = pd.DataFrame(0, index=multi_index, columns=multi_index) # 遍历所有行、列索引组合,计算匹配次数 for (row_col, row_val), _ in result.iterrows(): for (col_col, col_val), _ in result.items(): # 统计同时满足row_col=row_val和col_col=col_val的行数 match_count = len(df[(df[row_col] == row_val) & (df[col_col] == col_val)]) result.loc[(row_col, row_val), (col_col, col_val)] = match_count print(result)
运行后输出结果与期望完全一致。
代码说明
MultiIndex.from_product生成包含列名+值的层级结构,匹配目标输出的行/列格式- 双重循环遍历所有索引对,用布尔索引筛选符合条件的行并统计数量
- 最终将统计结果填充到初始化的全0DataFrame,得到目标交叉表
内容的提问来源于stack exchange,提问作者Vivek Kalyanarangan
相关产品推荐
相关产品推荐

