NetworkX csv edgelist结构

时间:2017-04-10 12:53:54

标签: python csv networkx

是否有将csv / txt中的边添加到NetworkX的标准结构?我已阅读文档并尝试使用read_edgelist('path.csv')add_edges_from('path.csv')但收到错误,说我的数据无法转换为字典,而且“边缘元组C是2元组或3元组”。我已经重新格式化了我的数据样本,有几种方法来测试不同的结构,包括列表和元组列表,删除空格以及在每一行中创建一个数字列表,但没有运气。以下是我的一些样本数据:

user_id,cluster_moves
11011,"[[86, 110], [110, 110]]"
2139671,"[[89, 125]]"
3945641,"[[36, 73], [73, 110], [110, 110]]"
10024312,"[[123, 27], [27, 97], [97, 97], [97, 97], [97,110]]"
14270422,"[[0, 110], [110, 174]]"
14283758,"[[110, 184]]"
14373703,"[[35, 97], [97, 97], [97, 97], [97, 17], [17,58]]"

目的是创建在群集之间(或群集内)移动的轨迹的网络图。每个列表都是群集内或群集之间的移动,例如,[[0, 110], [110,174]]是群集0->110->174的移动。有没有办法格式化我的数据,以便networkx可以读取它?

快速示例代码我正在测试数据:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
edges = g.add_edges_from('path.csv')

nx.draw(g)
plt.draw
plt.show()

修改

networkx中读取时,是否可以为此数据结构添加边缘权重,然后根据边缘的计数/频率调整权重?我想这样做,所以我可以将具有更高频率/数量的边缘可视化为另一种颜色/线宽。使用下面的答案,我尝试使用g.add_weighted_edges_from()并使用weight=1作为属性,而不是使用g.add_edges_from(),但这无效。我也尝试过使用它而没有运气:

for u,v,d in g.edges():
    d['weight'] = 1
g.edges(data=True)
edges = g.edges()
weights = [g[u][v]['weight'] for u,v in edges]

1 个答案:

答案 0 :(得分:1)

首先,您的数据无效csv来自Comma separated values

  

必须引用包含逗号或双引号字符的字段。

这意味着您应该使用双引号来引用您的列表:

user_id,cluster_moves
11011,"[[86, 110], [110, 110]]"
2139671,"[[89, 125]]"
3945641,"[[36, 73], [73, 110], [110, 110]]"
10024312,"[[123, 27], [27, 97], [97, 97], [97, 97], [97,110]]"
14270422,"[[0, 110], [110, 174]]"
14283758,"[[110, 184]]"
14373703,"[[35, 97], [97, 97], [97, 97], [97, 17], [17,58]]"

您可以使用csv模块阅读此文件,然后使用eval()将字符串转换为列表,并使用add_edges_from创建网络图:

import csv
import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
for row in csv.reader(open('ooo.csv', 'r')):
    if '[' in row[1]:       #
        g.add_edges_from(eval(row[1]))

nx.draw(g)
plt.draw
plt.show()

enter image description here