我开始使用图表工具,从pandas数据框df
导入边缘列表,如:
node1 node2
0 1 2
1 2 3
2 1 4
3 3 1
4 4 3
5 1 5
所以基本上是有向边的列表。我根据教程将它们导入到图形工具中:
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())
获得:
实际上哪一个是正确的。任何人都可以重现这个?这里的问题是我正在使用大型网络(~4 * 10 ^ 6个节点),我认为.tolist()
方法会在此过程中浪费大量内存。
编辑:添加绘制图表的代码:
graph_draw(g, vertex_text=g.vertex_index, vertex_font_size=18, output_size=(200, 200), output="graph.png")
答案 0 :(得分:0)
这真是奇怪的行为,我从未使用过图表工具(总是networkx)所以我现在无法复制,但这可能会有所帮助。
根据docs edge_list
可以是迭代器。这意味着您可以尝试使用理解来创建df.values.tolist()
中的生成器并将其作为edge_list
传递,我不知道它是否会加速您的速度(~4 * 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
只是一个想法
答案 1 :(得分:0)
我无法重现这一点。如果我从csv文件加载数据框:
node1,node2
1,2
2,3
1,4
3,1
4,3
1,5
我在致电g.add_edge_list(df.values)
后得到你的第二个数字。
答案 2 :(得分:0)
这很旧,但是我注意到,如果您从列的主要顺序中读取数据对的成对顶点,则会出现第一个图。我想这是奇怪行为的根源。