我尝试使用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
答案 0 :(得分:1)
问题在于您尝试在三个元素之间生成一个边缘。
add_edges_from()
函数获取元组列表并在每个元组的两个元素之间创建边。例如
g = networkx.Graph()
g.add_edges_from([(1,2), (3,4)])
将生成两条边:一条在节点1
和2
之间,另一条在节点3
和4
之间。
zip
函数在您的代码集user.user1
和user.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'})