繁体   English   中英

使用带有Networkx库的Python在图形中创建复杂结构

[英]Creating complex structures in graphs using Python with networkx library

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

因此,我在熊猫数据框中上传了带有两列的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

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

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

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

会产生两条边:一条在节点12之间,一条在节点34之间。

zip函数在代码中对user.user1user.user2集合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')]

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

实现您正在寻找的一种可能性:

例如,由于工作地点相同,用户1连接到用户2

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM