首页 > 解决方案 > 使用 Python 从数据矩阵生成边缘表的最佳方法

问题描述

我想从数据表中生成基因图。我的表 T 有 2 列,一列“ID”和一列“基因”,其中包含列表。列表包含基因(字符串)。

我希望我的基因作为节点(每个基因一个节点),并且边缘应该连接到共享一个不同 ID 的两个基因。我尝试了很多,但我需要最快的解决方案,因为该表有 70 万到 270 万行。

我应该如何进行?就像我怎样才能在我的表中找到特定基因的所有外观?

我已经实现了生成所有mentionend 基因的nd.array。接下来,我尝试使用 nd.nditer 遍历该列表两次以获取所有成对组合,然后遍历所有行以检查两个基因是否都在其中一个列表中。下面的例子。

接下来,我尝试首先通过查找特定基因的所有 id 来转换表格,然后从那里开始。这个想法是第二个for循环。

两者都不是很有效,所以我问是否有更有效的解决方案来解决这个问题。

for gene1 in nd.nditer(mentionendGenes):
    for gene2 in nd.nditer(mentionendGenes):
        for row in range(0,len(T['ID'])):
            if (gene1 in T['Genes'].values[row]) and (gene2 in T['Genes'].values[row])
                G.add_edge(gene1,gene2)


for gene in np.nditer(mentionendGenes):
    for listofgenes in np.nditer(T['Genes'].values, flags = ['refs_ok']):
        if gene in listofgenes:
            doStuff()

标签: pythonpandasnumpynetworkx

解决方案


部分答案:

您的第一种方法可以通过简单地调用来简化(并加速)

import itertools
for row in range(0,len(T['ID'])): 
    G.add_edges_from(itertools.combinations(T['Genes'].values[row], 2))

您可能会发现通过首先获取所有行的所有边可以进一步改善这一点。为了进行适当的基准测试,我们需要一个大小合适的测试集。


推荐阅读