如何用Pandas从两列邻接列表生成基于交集计数的邻接矩阵
原代码核心偏差
当前流程维度完全错位:用pd.crosstab(df.Drug, df.Gene)生成的是「药物行、基因列」的计数矩阵,后续直接拿药物列表同时重索引行和列,本质是让药物列表去匹配基因列,根本无法生成「药物与药物间的交集计数邻接矩阵」。
正确实现逻辑
核心是计算每两个药物绑定的基因集合的交集大小,可通过矩阵乘法批量完成计算,步骤为:
- 对原始两列邻接表去重,避免同个「药物-基因」条目重复出现导致计数偏差
- 构建「药物×基因」的0-1指示矩阵:存在关联记1,无关联记0
- 将指示矩阵的行对齐目标药物列表,无任何关联的药物条目填充全0值
- 将指示矩阵与其转置做矩阵乘法,得到的矩阵每个位置值即为两药物共同关联的基因总数
- 将矩阵对角线(药物与自身的自关联计数)全部设为0,匹配示例邻接矩阵无自环的要求
修正后可运行代码
import pandas as pd import numpy as np # 读取原始Drug-Gene两列邻接表,去重 df = pd.read_csv('lista.csv').drop_duplicates() # 读取需要纳入矩阵统计的所有药物节点列表 drugs = pd.read_csv('drugs.csv')['Drug'].tolist() # 构建药物-基因指示矩阵,对齐所有目标药物 drug_gene_mat = pd.crosstab(df['Drug'], df['Gene']).reindex(index=drugs).fillna(0) # 转为0-1指示值(如果需要按关联次数统计,注释掉下面这行即可) drug_gene_mat = (drug_gene_mat > 0).astype(int) # 矩阵乘转置,计算两两药物的共同关联数 adj_matrix = drug_gene_mat @ drug_gene_mat.T # 将对角线的自计数值设为0 np.fill_diagonal(adj_matrix.values, 0)
结果说明
按照给出的示例邻接表数据(A关联x/y/z、B关联x/w、C关联x/w/i),运行代码得到的邻接矩阵为:
| A | B | C | |
|---|---|---|---|
| A | 0 | 1 | 1 |
| B | 1 | 0 | 2 |
| C | 1 | 2 | 0 |
注:你之前给出的示例邻接矩阵数值为结构参考,实际计数会严格匹配两节点的真实关联交集大小
内容的提问来源于stack exchange,提问作者Samael Olascoaga
相关产品推荐
相关产品推荐

