尝试使用networkx将边和节点添加到图形中

时间:2017-05-04 18:21:42

标签: python database networkx

所以我有一个数据框,我试图使用networkx放入图表。数据框的样本如下:

Alabama Alabama 0
Alabama Alaska  0
Alabama Arizona 0
Alabama Arkansas    1
Alabama California  1
Alabama Colorado    1
Alabama Connecticut 0
Alabama Delaware    0

我试图让它设置为0和1是同一列中相应节点之间的边。因此节点Alabama Alabama将具有0的自循环等。我试过了

graph = nx.Graph() graph.add_edges_from([test3])

但是它给了我错误:dtype:int64必须是2元组或3元组。

考虑到我可能需要更改此数据框,我应该如何创建此图表。

PS:这个数据框中有2601条边,美国所有州都有。

1 个答案:

答案 0 :(得分:1)

我无法通过0的边或循环来说明你的意思。我假设你的意思是0代表没有边缘而1代表边缘。

命令graph.add_edges_from([test3])期望边缘列表作为其输入(类似[(1,2), (2,3), (1,5)])。您给它一个列表,其唯一的条目是test3

Networkx具有内置功能,可以从pandas数据帧from_pandas_dataframe(df, source, target, edge_attr=None, create_using=None)读入。

但是,它期望每一行都是一条边(如果你只想为边指定一个0或1的属性,那么你就设置了)。检查the documentation

如果你的意思是0被解释为没有边缘,那么你需要在调用它之前去掉那些条目。否则,您可以查看the source code,除了在add_edge命令之前,您几乎可以关注它,您可以添加一个关于值是0还是1的测试。

我相信以下内容可行(df是数据框,source是一个州列的名称,target是其他州列的名称,value是0/1列的名称:

g=nx.Graph() #undirected, no loops.
src_i = df.columns.get_loc(source)
tar_i = df.columns.get_loc(target)
val_i = df.columns.get_loc(value)
for row in df.values:
    if row[val_i] == 1:
        g.add_edge(row[src_i], row[tar_i])