【问题标题】:Creating complex structures in graphs using Python with networkx library使用 Python 和 networkx 库在图中创建复杂结构
【发布时间】:2016-10-28 05:41:01
【问题描述】:

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

所以我上传了 xlsx 文件,其中包含 pandas 数据框中的两列。有相互喜欢的用户(例如,在某些社交网络中)。

然后,创建了图形结构,计算了主要度量(度、页面排名、介数)并绘制了图。

这是交易:

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

【问题讨论】:

  • 请给我们重现您的错误所需的代码
  • g=nx.Graph() a=g.add_edges_from(zip(users.user1,users.user2, users.user3))。当我在用户数据框和 zip 函数中添加第三列时,错误就开始了

标签: python graph networkx


【解决方案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')]

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

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

比如user1因为同一个工作地点连接到user2

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

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

【讨论】:

  • 酷,感谢您的解释-但是如何为整个数据框完成呢?我们应该也使用 zip 吗?
  • 这取决于你想对图表做什么。第三个值(工作地点)是否必须是图中自己的节点?或者用工作地点标记用户之间的边缘是否足够?在任何情况下,您可以使用zip 来获取所有三元组,然后对它们进行迭代以执行您想做的任何事情(在用户之间添加边,用工作位置标记边)。那没问题。仅仅试图直接在所有三个元素上添加一条边是不可能的。
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 2011-12-07
  • 2018-12-12
  • 1970-01-01
  • 2013-11-24
  • 2020-07-16
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多