graph-tool - 从pandas数据帧中读取边缘列表

时间:2016-02-17 14:34:46

标签: python pandas graph graph-tool

我开始使用图表工具,从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,并绘制图表,我获得了:

enter image description here

不是数据帧的原始 edge_list 的表示。我尝试将*edge_list* = df.values.tolist()设置为:

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

获得:

enter image description here

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

编辑:添加绘制图表的代码:

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

3 个答案:

答案 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)

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