使用Python和networkx库在图中创建复杂结构

2024-09-27 07:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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}$

Tags: importnetworkxmapasplt结构userspd
1条回答
网友
1楼 · 发布于 2024-09-27 07:25:38

问题是你试图在三个元素之间生成一条边。在

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

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

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

在代码中对集合user.user1user.user2调用的zip函数返回这样一个元组列表(确切地说,它是一个zip对象,但在本例中,它的处理方式与列表完全相同)。在您的示例中,列表如下所示:

^{pr2}$

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

正如你在评论中所说,你现在正试图执行

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

但这会生成一个三元组的“列表”:

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

这就是导致问题的原因。我们不能在三个元素之间生成一条边;只能在两个元素之间生成。在

实现您所期望的目标的一种可能性:

for example the user1 connected to user2 because of the same working place

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

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

相关问题 更多 >

    热门问题