NetworkX csv 边缘列表结构

NetworkX csv edgelist structure

是否有标准结构用于将 csv/txt 中的边添加到 NetworkX 中?我已阅读文档并尝试使用 read_edgelist('path.csv')add_edges_from('path.csv'),但收到错误消息说我的数据无法转换为字典,还有 "Edge tuple C be a 2-tuple or a 3-tuple"。我已经用几种方法重新格式化了我的数据样本,以测试不同的结构,包括列表列表和元组列表,删除白色 space 并在每一行中创建一个数字列表,但没有成功。以下是我的一些示例数据:

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的时候给这个数据结构加上边权值,然后根据某条边的count/frequency调整权值?我想这样做,这样我就可以将具有更高 frequency/count 的边可视化为另一个 color/line 权重。使用下面的答案,我尝试使用 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]

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

Fields with embedded commas or double-quote characters must be quoted.

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

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()