pandas - 带有指向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
功能,但输入格式不同。我不知道创建有向图的最有效方法。
解决方案
您可以使用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')
推荐阅读
- docker - 在 pbuilder-dist 中找不到 makeinfo 命令
- wordpress - 尝试在 Wordpress 上移动插件元素 - 粘贴到容器代码中会删除输入类
- javascript - 我需要帮助在 Javascript 中使用双重承诺
- riscv - RISC-V 中的寄存器使用
- gcc - 目标模式不包含“%”。停止。使用 $(shell sh -c "./ " ) 时(当前工作目录)
- python - 如何使用 autograd.grad 计算 PyTorch 中参数的 Hessian 损失
- javascript - 在 if 条件中丢弃空值的最佳方法是什么 - JavaScript
- linux - GNU Parallel 教程的声明中的“部分记录”是什么意思?
- python - 如何使用 matplotlib 获得稳定的绘图
- ruby-on-rails - 如何在 Rails 中设置 url 路由?