如何基于节点之间的其他边缘有条件地(使用python Networkx包)在网络中创建边缘?

时间:2019-07-15 09:48:46

标签: python networkx graph-theory

我有一个显示父子关系但没有兄弟姐妹子子关系的数据集。我正在使用python的Networkx包(python版本3.6)构建网络。我想在兄弟姐妹之间添加边缘(如果孩子共享父母,则他们是兄弟姐妹)。我该怎么办?

我发现了一些有关条件边缘创建的问题,但是在这些问题中,条件不取决于其他节点属性(例如,某些节点的现有边缘):

python networkx remove nodes and edges with some condition

但是我不确定如何根据自己的情况制定条件,以实现我想要的目标。

import networkx as nx

dat = {'child':[1,1,4,4,5,5,8,8], 'parent':[2,3,2,3,6,7,6,7]} 

# Create DataFrame 
data = pd.DataFrame(dat) 

# Create graph with known connections
G = nx.Graph()

def create_edges(row):
    return G.add_edge(row['child'],row['parent'])

data.apply(create_edges, axis=1)

我想在节点1和4以及节点5和8之间创建边缘(因为它们共享父级并且显然是兄弟姐妹),但不在1到5或4到8之间。

1 个答案:

答案 0 :(得分:1)

我希望我不要使事情复杂化,但这就是我要去的方式:

首先,将孩子与共同父母分组。结果变量parents_children是一个dict,其中父母作为键,每个父母的孩子作为值。

parents_children = {parent: {child for child in dat['child'] 
                         if (parent,child) in list(zip(dat['parent'],dat['child']))} 
                for parent in dat['parent']}

然后,遍历一对具有相同父母的孩子,并在它们之间添加一条边线:

from itertools import combinations
for children in parents_children.values():
    for children_couple in combinations(children,2):
        G.add_edge(*children_couple)

我将它放在一边,我认为结果是正确的。