【发布时间】:2020-05-11 06:09:37
【问题描述】:
已编辑
我真的需要 Networkx/graph 专家的帮助。
假设我有以下数据框,我想将这些数据框转换为图表。然后我想根据描述和优先级属性将这两个图与相应的节点进行映射。
df1
From description To priority
10 Start 20, 50 1
20 Left 40 2
50 Bottom 40 2
40 End - 1
df2
From description To priority
60 Start 70,80 1
70 Left 80, 90 2
80 Left 100 2
90 Bottom 100 2
100 End - 1
我刚刚转换了两个数据框并创建了一个图表(g1 和 g2)。
然后我尝试根据节点的描述和优先级匹配节点一次。例如10/60, 40/100, 50/90,但不是20/70, 20/80, and 70/80。 20 有三个条件要映射,这不是我想要的。因为我只想映射节点一次,除非我想将它们作为单个节点并将节点标记为红色以区分。
一个节点应该只映射一次意味着,例如,如果我想映射10,它在第一个图上具有优先级1和描述Start,然后在第二个图上找到相同的优先级和描述图形。为此,有 60 个。除了 60 之外,没有其他节点。但如果我们在第一张图上取 20,它的优先级为 2,描述为 left。在第二张图中,有两个节点的优先级为2,描述为left,即70 and 80。这会造成混乱。我不能像20/70 and 20/80 那样将 20 映射两次。但我想将它们作为单个节点放在示例图中,如下所示。
我期待以下结果。
为了得到上面的结果,我用下面的python代码试了一下。
mapped_list= []
for node_1, data_1 in g1.nodes(data=True):
for node_2, data_2 in g2.nodes(data=True):
if (((g1.node[node_1]['priority']) == (g2.node[node_2]['priority'])) &
((g1.node[node_1]['description']) == (g2.node[node_2]['description']))
):
if (node_1 in mapped_list) & (node_2 in mapped_list): // check of if the node exist on the mapped_list
pass
else:
name = str(node_1) + '/' + str(node_2)
mapped_list.append((data_1["priority"], data_1["descriptions"], node_1, name))
mapped_list.append((data_2["priority"], data_2["descriptions"], node_2, name))
谁能帮我实现图/graph/上显示的上述结果?任何帮助表示赞赏。
【问题讨论】:
标签: python graph mapping networkx