我正在尝试使用Python和networkx创建网络。我将边数据作为tsv(节点,节点,权重):
1 2 34
1 4 23
1 5 25
2 4 46
2 5 90
2 12 4
...
和具有任意属性(例如颜色,类型,形状)的节点数据,也是tsv:
1 red cat round
2 blue mouse round
3 green rat triangle
4 yellow trex square
我想结合这些信息来创建一个网络。到目前为止,一切正常:
df = pd.read_csv('nodes.tsv', sep='\t') # using pandas to read
for idy, row in df.iterrows():
G2.add_node(row[0], color = row[1], type = row[2], shape = row[3])
...
with open('edges.tsv','rb') as edges_file:
G = nx.read_weighted_edgelist(edges_file)
...
G2.add_weighted_edges_from(G.edges(data = True))
在这里,最后一行是问题。
>>>print(str(G2.edges(data=True))[1:200])
[('1', '2', {'weight': {'weight': 34}}), ('1', '4', {'weight': {'weight': 23}})
如何删除这些双重'权重'?有更好的方法吗?
答案 0 :(得分:1)
不使用add_weighted_edges_from
,而是
G2.add_edges_from(G.edges(data = True))
即,从命令中删除weighted
部分。
G.edges(data=True)
中任何元组的第三个条目是包含边的所有属性的dict。 add_edges_from
会发现边缘是按照(node1, node2, dict)
形式添加边的事实加权的,并且会发现dict是属性的字典。
使用add_weighted_edges_from
会导致问题,因为它希望输入的格式为(node1, node2, weight)
。因此,它将权重解释为整个字典,而不是字典的内容。
答案 1 :(得分:0)
不要使用nx.read_weighted_edgelist
。使用nx.read_edgelist
会正确阅读,因此您只有{'weight': 34}
等等。
或者,您可以控制edges.tsv
的创建方式。一般情况下,将nx.read_weighted_edgelist
与nx.write_weighted_edgelist
和nx.read_edgelist
与nx.write_edgelist
配对。