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()
是否有标准结构用于将 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()