是否有将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]
答案 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()