如何基于多列二值化(1/0)DataFrame快速生成列间配对计数矩阵
快速生成二值化DataFrame的两两列计数矩阵
嘿,手动一个个列组合筛选计数确实太折腾了!其实用矩阵乘法就能一步到位,效率拉满,完全不用重复写筛选代码。
核心思路
因为你的数据是0/1二值化的,转置后的DataFrame和原DataFrame做矩阵乘法,得到的结果正好是每两列同时为1的行数——这就是你要的计数矩阵!矩阵乘法的本质是对对应位置元素相乘后求和,只有当两个元素都是1时乘积才为1,求和结果就是同时为1的行数,完美匹配需求。
代码实现
先构造一个和你结构一致的示例DataFrame:
import pandas as pd import numpy as np # 生成示例二值化数据(固定随机种子方便复现) np.random.seed(42) df = pd.DataFrame(np.random.randint(0, 2, size=(100, 7)), columns=['A', 'B', 'C', 'D', 'E', 'F', 'G'])
然后一行代码生成计数矩阵:
# 计算两两列同时为1的计数矩阵 count_matrix = df.T @ df
结果说明
输出的count_matrix是一个对称矩阵,行和列都是原DataFrame的列名:
count_matrix.loc['A','B']就是A列和B列同时为1的行数- 对角线的
count_matrix.loc['A','A']是A列自身为1的总行数
如果只想保留不同列之间的配对(隐藏对角线的自身计数、避免重复的下三角数据),可以再加一步处理:
# 只保留上三角部分(k=1表示排除对角线) count_matrix = count_matrix.where(np.triu(np.ones(count_matrix.shape), k=1).astype(bool))
这个方法不管你有多少列都能快速处理,完全不用手动写循环或者逐个筛选组合,比你原来的方法高效太多啦!
内容的提问来源于stack exchange,提问作者Veki




