python中的二部网络

问题描述

我是 python 的新手,并试图从类似于此的数据创建一个二分网络:

| User     |       Text          |
| -------- | ------------------- |
| user1    |[ 'abc','xyz','def' ]|
| user2    |[ 'lmo','gf' ]       |
| user3    |[ 'lmn','gf' ]       |
| user4    |['abc','def' ] |

当我创建一个网络时,表示文本列的节点将在节点处有一个列表作为值,如下所示:

enter image description here

我想为 abc、xyz 等创建单独的节点,然后将这些节点与其各自的用户连接起来,而不是在节点上有列表。例如 user1 将分别在 abc、xyz 和 def 之间有一条边。我怎样才能以这样的方式打破列表,即列表中的每个值都可以作为一个单独的节点。我被困在这里。提前感谢您的帮助。到目前为止,我的代码如下:

    sub_data = pd.read_csv('E:\\users.csv')
    edges = [tuple(x) for x in sub_data[['user','text']].values.tolist()]
    B = nx.Graph()
    B.add_nodes_from(sub_data['user'].unique(),bipartite=0,label='user')
    B.add_nodes_from(sub_data['text'].unique(),bipartite=1,label='hashtag')
    B.add_edges_from(edges,label='rating')
    left_or_top = sub_data['user'].unique()
    pos = nx.bipartite_layout(B,left_or_top)
    nx.draw(B,pos,node_color='#A0CBE2',edge_color='#00bb5e',width=1,edge_cmap=plt.cm.Blues,with_labels=True)
  

解决方法

这是一个可能的解决方案:

import networkx as nx
import pandas as pd

df = pd.DataFrame({'user': ['user1','user2','user3','user4'],'text': [['abc','xyz','def'],['lmo','gf'],['lmn',['abc','def']]})
graph = nx.convert_matrix.from_pandas_edgelist(
    df.explode('text').rename(columns={'user': 'source','text': 'target'})
)

重命名您的列很重要,因为 nx.convert_matrix.from_pandas_edgelist 期望在您的数据框中找到“源”和“目标”。

如果你打印 graph.edges 你可以看到你得到了正确的结果:

[('user1','abc'),('user1','xyz'),'def'),('abc','user4'),('xyz',('def',('user2','lmo'),'gf'),('gf','user3'),('user3','lmn')]