问题描述
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
的边缘属性,而无需构建第二个图甚至第二个数据框。