[英]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.