Python-遍历边缘列表,对于具有特定属性的节点,查找具有不同特定属性的所有连接节点?

问题描述 投票:0回答:1

我有一个边缘列表,其中包含两个产品之间的24 000个不同的边缘。如果产品B是A的子组件,则会在A和B之间创建一条边。

边缘列表采用以下格式:

 Parent | Child | Root | Child Meta
  AA1      BB1    AA1      ...  
  AA1      BB2    AA1      ...
  BB2      CC1    AA1      ...  
  AA2      BB3    AA2
  AA2      BB4    AA2
  BB4      CC1    AA2      ... 
  BB4      DD1    AA2      ...
  DD1      EE1    AA2
  DD1      EE2    AA2
  BB4      FF1    AA2
  FF1      GG1    AA2      ...
  GG1      EE3    AA2

因此,我想通过Root分组,对于DD*FF*形式的所有父母,在EE*形式中找到与其有直接联系的孩子。在上面的示例中,我希望输出数据框看起来像

 Parent | Child | Root | Child Meta
   DD1     EE1    AA2      ... 
   DD1     EE2    AA2      ...
   FF1     EE3    AA2      ...

我知道如何做到这一点的唯一方法是遍历pandas DataFrame,并使用递归函数遍历子级,直到我击中EE*子级。这需要永远。也许这里有使用networkx的聪明方法?还是有其他方法可以使用速度更快的熊猫来做到这一点?

python pandas networkx
1个回答
0
投票

如果我对问题的理解正确,那么从底部开始并找到向上的节点可能会更快。 (因为1.您知道要“查找”的子级子集,并且2.您的数据似乎像树一样组织,即每个节点在“子级”列中仅出现一次,因此始终只有一个路径向上。)

在普通的Python方法中,类似这样的操作将找到“ E”个子级的所有父节点:

data = """AA1      BB1    AA1
  AA1      BB2    AA1 
  BB2      CC1    AA1 
  AA2      BB3    AA2
  AA2      BB4    AA2
  BB4      CC1    AA2 
  BB4      DD1    AA2
  DD1      EE1    AA2
  DD1      EE2    AA2
  BB4      FF1    AA2
  FF1      GG1    AA2
  GG1      EE3    AA2"""

# tuple is (parent, child, root)
tuples = {tuple(l.split()) for l in data.split("\n")}

nodeByChild = {n[1]: n for n in tuples}

def expand(nodes):
    found = set()
    while nodes:
        node = nodes.pop()        
        if not node in found:            
            current = node 
            while current:
                found.add(current)
                current = nodeByChild.get(current[0], None)
    return found

leaves = {(p, c, r) for (p, c, r) in tuples if c.startswith("E")}
for t in expand(leaves):
    print(t)

如果一个产品可以是一个以上的孩子,那么必须对其进行调整以允许多个“父节点”。

© www.soinside.com 2019 - 2024. All rights reserved.