使用带有networkx库的

时间:2016-10-27 09:42:05

标签: python graph networkx

我尝试使用networkx库在Python中实现图论理论的第一步。

所以我已经在pandas dataframe中上传了两列xlsx文件。有些用户互相喜欢(例如,在某些社交网络中)。

然后,创建图形结构,计算主要度量(度,页面,中间性)和绘制的图。

这是交易:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

users=pd.read_excel('users.xlsx')
users.head()

user1 user2
Bob   Adam  
Adam  John
John  Bob

g=nx.Graph()
a=g.add_edges_from(zip(users.user1,users.user2))

cc=sorted(nx.connected_components(g),key=len, reverse=True)
G = g.subgraph(cc[0])

centrality = pd.DataFrame({'user':G.nodes()})

centrality['degree'] = centrality.user.map(nx.degree(G))
centrality['pagerank'] = centrality.user.map(nx.pagerank(G))
centrality['betweenness'] = centrality.user.map(nx.betweenness_centrality(G))

nx.draw(G)
plt.show()
plt.savefig("path.png")

所以,到目前为止,一切都很顺利。但我的目标是创造更复杂的结构。例如,我的想法是在linkedin中执行某些操作,例如,由于相同的工作场所,user1连接到user2。

换句话说,我想我应该以某种方式将第三列添加到数据框并将其附加到图形中。但是当尝试这样做并使用zip函数(比如两列)时,add_edges_from会给我一个错误并说它只能处理两个参数。

能否请您帮助我了解如何将图表应用于此结构:

User1   User2   Company
Bob     Adam     Vilco
Adam    John     Darrel
John    Bob      Vilco

1 个答案:

答案 0 :(得分:1)

问题在于您尝试在三个元素之间生成一个边缘。

add_edges_from()函数获取元组列表并在每个元组的两个元素之间创建边。例如

g = networkx.Graph()
g.add_edges_from([(1,2), (3,4)])

将生成两条边:一条在节点12之间,另一条在节点34之间。

zip函数在您的代码集user.user1user.user2中调用,会返回这样的元组列表(确切地说,它是zip对象,但在这种情况下,它被视为完全像列表)。在您的示例中,列表如下所示:

[('Bob', 'Adam'), ('Adam', 'John'), ('John', 'Bob')]

这对add_edges_from来说没问题。它只是在每个元组的两个名称之间生成一个边缘。

正如您在评论中所述,您现在正在尝试执行

g.add_edges_from(zip(users.user1,users.user2, users.user3))

然而,这会生成三元组的“列表”:

[('Bob', 'Adam', 'Vilco'), ('Adam', 'John', 'Darrel'), ('John', 'Bob', 'Vilco')]

这是导致问题的原因。我们无法在三个元素之间生成一个边缘;只有两个。

实现您所寻找目标的一种可能性:

  

例如,因为工作地点相同而连接到user2的user1

是将工作场所的名称添加到两个用户之间的边缘作为属性:

g.add_edge('Bob', 'Adam', {'working_place': 'Vilco'})