所以我有一个数据框,我试图使用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条边,美国所有州都有。
答案 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])