2016-11-29 2 views
0

Ich bin mit einem seltsamen Problem fest. Ich lese Daten aus einer CSV-Datei und wandle sie in ein mehrstufiges Wörterbuch um.Konvertieren Multilevel-Wörterbuch in ein Netzwerkdiagramm in Python

CSV-Format: Ich habe insgesamt 1500 Zeilen in meiner CSV-Datei, siehe das Format unten.

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 

In der obigen Datei, die erste Spalte eine Quellenstation bezeichnet, die zweite Spalte eine Zielstation, und die dritte Spalte stellt den Abstand zwischen ihnen.

Ich muss Dijkstra-Algorithmus anwenden, um die kürzeste Entfernung zwischen zwei Stationen zu finden, und dafür muss ich die ganze CSV-Datei in eine gewichtete Grafik konvertieren, in der jede Station ein Knoten ist und der Abstand zwischen ihnen ist Gewicht der Kante.

Mein Ansatz:

Zuerst bin ich jede Zeile aus der CSV-Datei zu lesen und sie in ein Multi-Level-Wörterbuch konvertieren. Ich bekomme dafür ein richtiges Wörterbuch. Unten ist mein Code.

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]} 

Jetzt muss ich dieses neu erstellte Wörterbuch in ein Diagramm umwandeln, um den Dijkstra-Algorithmus anzuwenden. Dafür verwende ich diesen Code:

G = nx.from_dict_of_dicts(my_dict) 

Aber ich erhalte eine Fehlermeldung, "TypeError: Input graph is not a networkx graph type".

Bitte helfen Sie mir. Wie kann ich die gesamte CSV-Datei in eine Grafik konvertieren, so dass ich den Dijkstra-Algorithmus anwenden kann, um eine kürzeste Entfernung zwischen zwei beliebigen Stationen zu finden.

+0

kann ein Duplikat von [diese Frage] (http://stackoverflow.com/questions/22768224/unable-to-load-a-simple-csv-in-networkx-in-python) sein. Überprüfe die akzeptierte Antwort. Ich bin mir nicht sicher, warum Sie eine Reihe von Wörterbüchern verwenden müssen ... – 3novak

+0

Danke, aber für den obigen Link, CSV hat ein anderes Format.Ich muss eine gewichtete Grafik aus Zeilen von CSV-Datei erstellen. Kannst du mir bitte vorschlagen, wie es weitergeht? –

+0

Können Sie die vollständige Fehlermeldung und ein [MCVE] geben? Die Fehlermeldung wird genau sagen, welche Zeile Ihres Codes es auslöst, und ich denke, es ist nicht in einer der Zeilen, die Sie angegeben haben. (Ihr Code löst bei mir einen anderen Fehler aus, den ich beheben kann, aber es wäre besser, wenn Sie Code bereitstellen, der den Fehler auslöst, den Sie haben). – Joel

Antwort

1

Ich bin nicht gut mit NetworkX vertraut, aber ich würde Folgendes mit Pandas und nx.from_pandas_dataframe() tun.

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

Vielen Dank ... es funktioniert einwandfrei :) –