我已经开始使用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
。
答案 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编号。如果你想给他们不同的名字",你必须使用属性地图,如文档中所述。