Python 在NetworkX中求加权图的最短路径长度

Python 在NetworkX中求加权图的最短路径长度,python,dictionary,network-programming,networkx,Python,Dictionary,Network Programming,Networkx,我正在尝试使用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'],

我正在尝试使用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']})
最后,应用
最短路径长度
算法,该算法表示长度为2(边数),而不是4.0(加权距离)。我怀疑这是因为我引用的权重属性不正确。然而,我不确定我该怎么做

nx.shortest_path_length(G=g, source='c', target='f', weight="['attributes']['weight']")


任何帮助都将不胜感激

图形的创建过于复杂。您可以使用
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\u path\u length
中指定权重。您使用的是
“['attributes']['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

感谢yatu,使用了
nx。从_pandas_edgelist
这很好地工作,应该很容易与代码的其余部分合并!