从Pandas DataFrame或CSV生成图表工具图

时间:2017-07-28 11:55:22

标签: python pandas graph graph-tool

我已经开始使用graph-tool,希望它是一个python库,允许我在Pandas DataFrame / CSV中分析大图(~8M顶点,~22M边缘)。 “source”和“target”列是特定数字服务的用户ID。

我从一个玩具示例开始,遵循方法in this post

import pandas as pd

df = pd.DataFrame({'source':range(11,15), 'target':range(12,16)})

g = Graph(directed=True)

g.add_edge_list(df.values)

你可以在我的虚拟例子中看到,只有5个不同的顶点(11, 12, 13, 14, 15)。但是,当我生成图形时,会创建16个顶点,似乎填补了0和最大节点值之间的差距。

g.get_vertices()

returns:

    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15], dtype=uint64)

我假设图形工具'读取'df的值作为索引,而不是实际的顶点名称。这来自docs

  

图中的每个顶点都有一个唯一的索引,它始终位于两者之间   :math:0和:math:N-1,其中:math:N是顶点数。

如何在没有这些冗余顶点的情况下创建图形(如果我导入我的数据,可能会有数百万个),以及如何使用不被视为索引的用户ID? 我一直在翻阅可用的方法/文档,无法弄明白,从df案件大量导入。

我还尝试了什么:

df.to_csv('test.csv', index=False)#, header=False)    
g2 = graph_tool.load_graph_from_csv('test.csv', skip_first=True)

这似乎创建了一个只包含5个顶点的图形,但“丢失”了它们的名称(用户ID)。

g2.get_vertices()

返回

array([0, 1, 2, 3, 4], dtype=uint64)

而不是[11, 12, 13, 14, 15]

感谢您的帮助!提前谢谢。

我在python 2.7上使用Jupyter/Anaconda

1 个答案:

答案 0 :(得分:2)

hashed方法的add_edge_list()参数启用了您想要的内容:

vmap = g.add_edge_list(df.values, hashed=True)

其中vmap是具有顶点"名称"的属性地图。

来自docstring:

  

可选地,如果hashed == True,则边缘列表中的顶点值       不假设直接对应于顶点索引。在这种情况下       它们将根据其中的顺序映射到顶点索引       遇到它们,以及带顶点值的顶点属性映射       退回。如果string_vals == True,则算法假定为       顶点值是字符串。否则,它们将被假定为数字       如果edge_list是:class:~numpy.ndarray,或任意python       对象,如果不是。

请注意,为了保证有效的数据结构,在图形工具顶点中总是连续的整数,因此它们将始终从0到N-1编号。如果你想给他们不同的名字",你必须使用属性地图,如文档中所述。