首页 > 解决方案 > 带有指向networkx有向图的链接列表的数据框

问题描述

我有一个用于链接文档集合的数据框,我想将其转换为带有边权重link_weight和节点属性的有向图doc_attribute。这样做的有效方法是什么?我在这里提供了一个小示例,但实际数据针对约 100k 文档,每个平均约 10 个链接。

例子:

import pandas as pd
import numpy as np
from string import ascii_lowercase

N = 100
doc_ids = [f"doc_{j}" for j in range(N)]
doc_attrs = np.random.choice(list(ascii_lowercase), N)
link_weights = np.random.choice(10, N)
links = [random.choices(doc_ids, k=np.random.choice(4)) for j in range(N)]
    
df = pd.DataFrame(data={"doc_attribute": doc_attrs, "link_weight":link_weights, "linked_docs":links}, index=doc_ids) 

通知文档可能不包含链接文档或文档链接:

      doc_attribute  link_weight               linked_docs
doc_0             b            3          [doc_55, doc_67]
doc_1             i            2                        []
doc_2             l            4                  [doc_72]
doc_3             f            1                  [doc_78]
doc_4             e            6                  [doc_50]
doc_5             k            3                  [doc_24]
doc_6             j            6    [doc_3, doc_6, doc_63]
doc_7             g            4  [doc_11, doc_59, doc_59]
doc_8             f            9                        []
doc_9             f            8                  [doc_57]

所需的输出:nx.DiGraph 对象,其节点由 给定df.index,有向边为linked_docs,节点属性为doc_attribute,链接权重为link_weight。Networkx 有from_dataframe功能,但输入格式不同。我不知道创建有向图的最有效方法。

标签: pandasnetworkx

解决方案


您可以使用from_dict_of_dicts,然后使用 set_node_attributes 设置节点的属性

dod = {d['index']: {t: {"weight": d['link_weight']} for t in d['linked_docs']} for d in
       df[['linked_docs', 'link_weight']].reset_index().to_dict('records')}

dg = nx.from_dict_of_dicts(dod, create_using=nx.DiGraph)
nx.set_node_attributes(dg, df['doc_attribute'].to_dict(), 'doc_attribute')

推荐阅读