我有一个看起来像这样的文件
1 2 1
1 3 1
2 999 1
2 1029 1
2 1031 1
2 1032 1
2 1197 1
2 1226 1
2 1296 1
3 450 1
3 933 1
3 934 1
3 955 1
3 1032 1
4 5 1
我想将其转换为networkx图,但出现以下错误-
G=nx.read_edgelist(fh)
File "<decorator-gen-400>", line 2, in read_edgelist
File "E:\anaconda\lib\site-packages\networkx\utils\decorators.py", line 227, in _open_file
result = func_to_be_decorated(*new_args, **kwargs)
File "E:\anaconda\lib\site-packages\networkx\readwrite\edgelist.py", line 378, in read_edgelist
data=data)
File "E:\anaconda\lib\site-packages\networkx\readwrite\edgelist.py", line 288, in parse_edgelist
"Failed to convert edge data (%s) to dictionary." % (d))
TypeError: Failed to convert edge data (['1']) to dictionary.
这是代码-
fh=open("YST_full.net", 'rb')
G=nx.read_edgelist(fh)
fh.close()
我在这里做什么错了?
编辑-我尝试将其转换为熊猫数据框
df=pd.read_csv("YST_full.net",sep=" ",names=['node1','node2','weight'])
print(df)
G=nx.from_pandas_edgelist(df, 'node1', 'node2', ['weight'])
现在我想将其转换为graphml格式-
nx.write_graphml(G, "YST_full.graphml")
但错误是-
nx.write_graphml(G, "YST_full.graphml")
File "<decorator-gen-440>", line 2, in write_graphml_lxml
File "E:\anaconda\lib\site-packages\networkx\utils\decorators.py", line 227, in _open_file
result = func_to_be_decorated(*new_args, **kwargs)
File "E:\anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 149, in write_graphml_lxml
infer_numeric_types=infer_numeric_types)
File "E:\anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 596, in __init__
self.add_graph_element(graph)
File "E:\anaconda\lib\site-packages\networkx\readwrite\graphml.py", line 658, in add_graph_element
T = self.xml_type[self.attr_type(k, "edge", v)]
KeyError: <class 'numpy.int64'>
答案 0 :(得分:0)
您必须通知networkx
第三列是一个称为“权重”的属性(或您称呼的任何属性):
graph = nx.read_edgelist("YST_full.net", data=(('weight', float),))
就您的第二个问题而言,有时networkx
在导出到GraphML之前无法将NumPy int64
转换为Python int
。您必须自己做:
weights = {(n1,n2): float(d['weight']) # or int()
for n1,n2,d in graph.edges(data=True)}
nx.set_edge_attributes(G, weights, 'weight')
答案 1 :(得分:0)
此错误是由于熊猫数据框的dtypes引起的。一种解决方法是将数据框列转换为字符串dtype。
site
输出:
df = df.apply(lambda x: x.astype(str))
G=nx.from_pandas_edgelist(df, 'node1', 'node2', 'weight')
nx.write_graphml(G,'test.out')
答案 2 :(得分:0)
今天,我开始学习网络分析,这是我遇到的第一个错误。我刚刚将G=nx.read_edgelist(fh)
更改为G=nx.read_weighted_edgelist(fh)
。
您还可以删除第三列并使用G=nx.read_edgelist(fh)
答案 3 :(得分:0)
如果您确实将G=nx.read_edgelist(fh)
更改为G=nx.read_weighted_edgelist(fh)
,它将起作用。
您不需要删除第三列。我正在为node2vec
项目使用 SNAP时间数据,遇到了与所述相同的错误,请使用G = nx.read_weighted_edgelist(args.input, nodetype=int, data=(('weight',float),),delimiter=',', create_using=nx.DiGraph())