使用Python从数据矩阵生成边缘表的最佳方法

时间:2019-01-29 19:02:42

标签: python pandas numpy networkx

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

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

我应该如何进行?就像我如何找到桌子上某个特定基因的所有外观?

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

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

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

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()

1 个答案:

答案 0 :(得分:0)

部分答案:

您的第一种方法可能只需调用

即可简化(并加快)
import itertools
for row in range(0,len(T['ID'])): 
    G.add_edges_from(itertools.combinations(T['Genes'].values[row], 2))

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