繁体   English   中英

图形工具-从pandas数据框中读取边缘列表

[英]graph-tool - reading edge lists from pandas dataframe

我开始使用graph-tool ,从pandas dataframe df导入边缘列表,例如:

   node1  node2
0      1      2
1      2      3
2      1      4
3      3      1
4      4      3
5      1      5

因此,基本上是有向边的列表。 我根据教程将它们导入到graph-tool中:

from graph_tool.all import *
import pandas as pd
# Read pandas dataframe
df = pd.read_csv('file.csv')
# Define Graph
g = Graph(directed=True)
# Add Edges
g.add_edge_list(df.values)

根据add_edge_list( edge_list )的文档: edge_list可以是形状为(E,2)的ndarray,其中E是边的数量,每行指定一对(源,目标)。

运行上面的代码设置edge_list = df.values,并绘制图形,我获得了:

在此处输入图片说明

这并不表示数据帧的原始edge_list 我试图通过以下方式设置*edge_list* = df.values.tolist()

g.add_edge_list(df.values.tolist())

获得:

在此处输入图片说明

哪个实际上是正确的。 任何人都可以重现吗? 这里的问题是我正在使用大型网络( .tolist() * 10 ^ 6个节点),并且我认为.tolist()方法将在此过程中浪费大量内存。

编辑:添加代码以绘制图形:

graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18, output_size=(200, 200), output="graph.png")

那真是奇怪的行为,我从来没有使用过图工具(总是networkx ),所以我现在无法重现,但这可能会有所帮助。

根据文档, edge_list可以是迭代器。 这意味着您可以尝试使用comprehension从df.values.tolist()创建一个生成器,并将其作为edge_list传递,我不知道它是否会加快您的edge_list * 10 ^ 6节点的速度。

看起来像这样:

g.add_edge_list((item for item in df.values.tolist()))

尺寸差异示例

import numpy as np
import sys

df = pd.DataFrame(np.random.rand(1000,2)) # example "large" dataframe

print sys.getsizeof(df.values.tolist())
print sys.getsizeof((item for item in df.values.tolist()))

8072 #type list
80 # type generator

只是一个主意

我无法重现。 如果我从csv文件加载数据帧:

  node1,node2
  1,2
  2,3
  1,4
  3,1
  4,3
  1,5

在调用g.add_edge_list(df.values)之后,我得到了第二个数字。

这很旧,但是我注意到,如果您按列主要顺序从数据框中读取成对的顶点,则会出现第一个图。 我想这是奇怪行为的根源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM