【问题标题】:Bipartite network in pythonpython中的二分网络
【发布时间】:2021-06-25 10:38:07
【问题描述】:

我是 python 新手,正在尝试从类似于以下的数据创建二分网络:

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

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

我想为 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)
  

【问题讨论】:

  • 这个问题:Pandas expand rows from list data available in columnfrom_pandas_edgelist 应该可以解决您的问题。
  • 我会尽量说得更具体一些。我认为基于@Sparky05 的链接sub_data = sub_data.explode('text1').reset_index(drop=True),对你有用。
  • 我已经尝试过该链接,但不幸的是它不起作用。它没有破坏列表,而是按原样显示数据。我不明白为什么它无法分离数据。:(

标签: python-3.x networkx


【解决方案1】:

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

import networkx as nx
import pandas as pd

df = pd.DataFrame({'user': ['user1', 'user2', 'user3', 'user4'],
                   'text': [['abc', 'xyz', 'def'], ['lmo', 'gf'],
                            ['lmn', 'gf'], ['abc', 'xyz', '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'), ('user1', 'def'),
 ('abc', 'user4'), ('xyz', 'user4'), ('def', 'user4'),
 ('user2', 'lmo'), ('user2', 'gf'), ('gf', 'user3'), ('user3', 'lmn')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    相关资源
    最近更新 更多