将第二条边的属性添加到现有图中

问题描述

我正在尝试在现有图形添加第二条边的属性

我创建了一个图形 G 并将其保存为 pkl 文件

edges1 = pd.DataFrame({'source':[0,1,2,3,4],'target':[10,11,12,13,14],'weight':[50,50,50]})
G = nx.from_pandas_edgelist(edges1,'source','target','weight')

我加载了 G,然后尝试添加第二条边的属性(成本)和一个节点属性。 但它不断覆盖第一条边的属性(权重)。

edges2 = pd.DataFrame({'source':[0,6,7,8],16,17,18],'cost':[100,100,100]})

nodes = pd.DataFrame({'node':[0,10,'name':['A','B','C','D','E','F']})
nx.from_pandas_edgelist(edges2,'cost')
nx.set_node_attributes(G,pd.Series(nodes.name,index=nodes.node).to_dict(),'name')

我必须加载图 G,因此组合edge1 和edge2 DataFrames 并创建图并不是我所需要的。

我怎样才能得到这个?

[(0,{'weight':50,'cost': 100}),(1,'cost': 100}) ...]

代替这个

[(0,{'cost': 100}),{'cost': 100}) ...]

解决方法

我不清楚您是否要从 edges2 添加新边。如果您可以添加新边,则可以使用 nx.compose:

H = nx.from_pandas_edgelist(edges2,'source','target','cost')
G_updated = nx.compose(G,H)

如果不想添加新边,可以先检查边是否存在,然后直接设置边属性:

H = nx.from_pandas_edgelist(edges2,'cost')
for edge in H.edges():
    if edge in G.edges():
        G.edges[edge]['cost'] = H.edges[edge]['cost']

如果性能是一个问题,您还可以考虑使用您的 G 数据直接设置 edges2 的边缘属性,而无需构建第二个图甚至第二个数据框。