2016-11-29 25 views
0

我遇到了一个奇怪的问题。我正在从CSV文件读取数据并将其转换为多级字典。在Python中将多级字典转换为网络图

CSV格式:我的CSV文件中共有1,500行,请参阅下面的格式。

1-103rd Street,1-96th Street,2327.416174 
1-116th Street–Columbia University,1-Cathedral Parkway–110th Street,2327.416174 
1-125th Street,1-116th Street–Columbia University,2327.416174 
1-137th Street–City College,1-125th Street,2327.416174 
1-145th Street,1-137th Street–City College,2327.416174 
1-14th Street,1-Christopher Street–Sheridan Square,2327.416174 

在上述文件中,第一列表示源站,第二列表示目的站,第三列提供它们之间的距离。

我将不得不应用Dijkstra的算法来找到两个站之间的最短距离,为此我需要将整个CSV文件转换为加权图,其中每个站都是一个节点,它们之间的距离是边缘的重量。

我的方法:

首先我是从CSV文件中读取每一行并将其转换成一个多层次的字典。我正在为此获取适当的字典。以下是我的代码。

my_dict = {} 

with open('final_subway_data.csv') as f_input: 
    for row in csv.reader(f_input): 
     my_dict[row[0]] = {row[1]: row[2]} 

现在我需要这个新创建的字典转换成图形,以便应用Dijkstra算法。为此,我正在使用此代码:

G = nx.from_dict_of_dicts(my_dict) 

但是我收到一个错误,说"TypeError: Input graph is not a networkx graph type"

请帮帮我。如何将整个CSV文件转换为图形,以便我可以应用Dijkstra的算法来找出任意两个站之间的最短距离。

+0

可能是一个重复的[这个问题](http://stackoverflow.com/questions/22768224/unable-to-load-a-simple-csv-in-networkx-in-python)。查看接受的答案。我不知道为什么你必须使用一堆字典... – 3novak

+0

感谢但是对于上面的链接,CSV格式不同。我需要从CSV文件中创建一个加权图。你能建议我如何继续请。 –

+0

你能给出完整的错误信息和[MCVE]吗?该错误消息将说明您的代码的哪一行会触发它,并且我认为它不在您提供的任何行中。 (你的代码为我引发了一个不同的错误,我知道如何解决,但如果你提供触发错误的代码会更好)。 – Joel

回答

1

我对NetworkX并不是很熟悉,但我会用熊猫和nx.from_pandas_dataframe()来做以下事情。

import pandas as pd 
import networkx as nx 

df = pd.read_csv('csvpath.csv', names=['origin', 'dest', 'dist']) 

g = nx.from_pandas_dataframe(df, source='origin', target='dest', edge_attr='dist') 

g['1-103rd Street']['1-96th Street']['dest'] 
# 2327.416174 
+0

非常感谢...它工作得非常好:) –