2

我开始使用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 是边数,每行指定一个 (source, target) 对。

运行上述代码设置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")
4

3 回答 3

0

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

根据文档 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

只是一个想法

于 2016-02-17T18:57:46.530 回答
0

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

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

打电话后我得到你的第二个数字g.add_edge_list(df.values)

于 2016-02-20T13:59:11.933 回答
0

这是旧的,但我注意到第一个图是如果您以列主要顺序从数据框中读取顶点对会发生什么。我想这是奇怪行为的根源。

于 2018-08-26T11:09:53.560 回答