我正在尝试使用networkx库在Python中实现图论概念的第一步。
因此,我上传了在pandas dataframe中包含两列的xlsx文件。有些用户彼此喜欢(例如,在一些社交网络中)。
然后,建立了图形结构,计算了主要指标(度、pagerank、betweenness)并绘制了图。
交易如下:
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是因为同一个工作地点。
换句话说,我想我应该以某种方式将第三列添加到dataframe并将其附加到graph中。但是当尝试这样做并使用zip函数(比如对于两列)方法add_edges_from会给我一个错误,并说它只能处理两个参数。
你能不能帮我理解一下,我该如何应用这个结构如下的图表:
^{pr2}$
问题是你试图在三个元素之间生成一条边。在
add_edges_from()
函数获取一个元组列表,并在每个元组的两个元素之间创建边。例如将生成两条边:一条在节点
1
和2
之间,一条在节点3
和4
之间。在在代码中对集合
^{pr2}$user.user1
和user.user2
调用的zip
函数返回这样一个元组列表(确切地说,它是一个zip
对象,但在本例中,它的处理方式与列表完全相同)。在您的示例中,列表如下所示:这对
add_edges_from
没有问题。它只是在每个元组的两个名称之间生成一个边。在正如你在评论中所说,你现在正试图执行
但这会生成一个三元组的“列表”:
这就是导致问题的原因。我们不能在三个元素之间生成一条边;只能在两个元素之间生成。在
实现您所期望的目标的一种可能性:
将工作地点的名称作为属性添加到两个用户之间的边缘:
相关问题 更多 >
编程相关推荐