2016-11-29 26 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

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