在Python

时间:2016-11-29 04:56:55

标签: python networkx

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

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算法找到任意两个站点之间的最短距离。

1 个答案:

答案 0 :(得分:1)

我不太熟悉NetworkX,但我使用pandas和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