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

如何用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),运行代码得到的邻接矩阵为:

ABC
A011
B102
C120

注:你之前给出的示例邻接矩阵数值为结构参考,实际计数会严格匹配两节点的真实关联交集大小

内容的提问来源于stack exchange,提问作者Samael Olascoaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 00:36:02