我正在尝试使用networkx确定源节点和目标节点之间的最短加权路径。为此,我正在使用nx.shortest_path
。但是,我无法使其正常运行。
以下类似于我的设置:
import pandas as pd
import networkx as nx
df = pd.DataFrame({'F': ['a','b','c','d','d','e'], # f node identifier
'T': ['b','c','d','e','f','f'], # t node identifier
'weight': [1.2,5.2,2.7,2.8,1.3,7.4], # weight for shortest path algorithm
'dummy': ['q','w','e','r','t','y']}) # dummy variable
网络构建是在函数内进行的,如果我能正常运行的话,它将被应用于一些不同的数据集!这也是为什么将属性作为字典而不是单独添加的原因。
def build_network(df=None, column_names=None):
g = nx.DiGraph()
for i,row in df.iterrows():
g.add_edge(row[column_names['F']],row[column_names['T']],attributes=row[column_names['attributes']].to_dict())
return g
g = build_network(df, column_names={'F':'F',
'T':'T',
'attributes':['weight','dummy']})
最后,应用shortest_path_length
算法,该算法指示长度为2(边的数量),而不是4.0(加权距离)。我怀疑这是因为我错误地引用了weight属性。但是,我不确定应该怎么做。
nx.shortest_path_length(G=g, source='c', target='f', weight="['attributes']['weight']")
任何帮助将不胜感激!
答案 0 :(得分:1)
您使图形的创建过于复杂。您可以使用nx.from_pandas_edgelist
以更简单的方式(包括边属性)从数据框创建图形,并找到最短路径长度,如下所示:
G = nx.from_pandas_edgelist(df, source='F', target='T', edge_attr=['weight','dummy'],
create_using=nx.DiGraph)
G.edges(data=True)
# EdgeDataView([('a', 'b', {'weight': 1.2, 'dummy': 'q'}),
# ('b', 'c', {'weight': 5.2, 'dummy': 'w'})...
nx.shortest_path_length(G, source='c', target='f', weight='weight')
# 4.0
更仔细地研究您的方法,问题在于如何在nx.shortest_path_length
中指定权重。当"['attributes']['weight']"
参数设置为指定权重属性名称的字符串时,您正在使用weight
。因此,在您的情况下,"weight"
。
因此,您将获得与以下相同的信息:
nx.shortest_path_length(G=g, source='c', target='f', weight=None)
# 2
您应该按照上面的步骤进行操作
nx.shortest_path_length(G, source='c', target='f', weight='weight')
# 4.0