You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:54:53