python - 如何修复有向图,使最顶层的父级始终是第一级?
问题描述
我有以下熊猫数据框:
parent, child
40066, 50106
30029, 40066
40066, 50100
40066, 50106
50106, 60061
50106, 60063
50106, 60062
50100, 60057
50100, 60058
我正在尝试达到以下结构:
child, level1, level2, level3
60063, 30029, 40066, 50106
60062, 30029, 40066, 50106
60061, 30029, 40066, 50106
60058, 30029, 40066, 50100
60057, 30029, 40066, 50100
我使用了以下代码:
import pandas as pd
import networkx as nx
df = (see above)
leaves = set(df.child).difference(set(df.parent))
g = nx.from_pandas_edgelist(df, 'parent', 'child', create_using=nx.DiGraph(), edge_attr=True)
ancestors = {n: nx.algorithms.dag.ancestors(g,n) for n in leaves{
df2 = pd.DataFrame.from_disc(ancestors, orient='index')
这给了我这个输出:
60063, 30029, 50106, 40066
60062, 30029, 50106, 40066
60061, 30029, 50106, 40066
60058, 30029, 50100, 40066
60057, 50100, 40066, 30029
这是不正确的(前 4 行应该有关联 30029 -> 400600 -> ...),最后一行的顺序完全错误。
解决方案
用于nx.all_simple_paths
查找从根到叶的所有路径。
完整代码:
import pandas as pd
import numpy as np
import networkx as nx
# setup initial data
df = pd.DataFrame({'parent': [40066, 30029, 40066, 40066,
50106, 50106, 50106, 50100, 50100],
'child': [50106, 40066, 50100, 50106,
60061, 60063, 60062, 60057, 60058]})
g = nx.from_pandas_edgelist(df, 'parent', 'child', create_using=nx.DiGraph)
# get leaves and roots
leaves = [node for node, degree in g.out_degree() if degree == 0]
roots = [node for node, degree in g.in_degree() if degree == 0]
# find all paths
paths = []
for root in roots :
for leaf in leaves :
for path in nx.all_simple_paths(g, root, leaf):
paths.append(path)
# create dataframe
df1 = pd.DataFrame(np.roll(paths, shift=1))
df1 = df1.add_prefix('level').rename(columns={'level0': 'child'})
输出:
>>> df1
child level1 level2 level3
0 60058 30029 40066 50106
1 60061 30029 40066 50106
2 60063 30029 40066 50106
3 60062 30029 40066 50100
4 60057 30029 40066 50100
推荐阅读
- angular - 如何使用 ng2-charts 获得多个图表(条形图和折线形图)?
- reactjs - 如何通过反应测试库获得代码覆盖率
- javascript - 如何使用 Javascript 伪造 Html5 GeoLocation API?
- c# - 从另一个列表中添加一个列表中的数据可以保存第一个列表的引用
- javascript - 如何在测试环境中使用 karma 在 webpack 中加载 3rd 方 jquery 库。$.fn.something 不是函数
- regex - bigquery 标准 sql = 从字符串中提取数据
- php - 如何在 PHP 或 Laravel 中将 ISO 消息 8583 发送到主机服务器
- mongodb - 为什么我的更新函数返回新查询但不更新数据库?
- excel - 自动化流程 - 打开多个 Web 表单,从 Excel 文件中填写
- angular - html2Canvas/jsPDF 只将视口中的数据转换为pdf?