微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的二部网络

如何解决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')]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。