怎么使用递归记录父子层次结构中的所有路由?

原学程将引见若何应用递回记载女子条理构造中的一切路由?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

怎么使用递归记录父子层次结构中的所有路由? 教程 第1张

成绩描写

我正在测验考试阅读分层数据帧,并将每一条能够的路由记载到另外一个数据帧中。这些道路的深度不妨可变。

原初数据帧(DF)。最低列表现女列中的值没有是所有:

的子值

女级 子项 最低
a b
b c 0
b d 0
d e 0

终究目的数据帧:

级别三 级别二 级别一 级别0
a b c
a b d e

这便是我今朝具有的

def search(parent):
 for i in range(df.shape[0]):
  if(df.iloc[i,0] == parent):
search(df.iloc[i,一])

for i in range(df.shape[0]):
 if(df.iloc[i,二] == 一):
  search(df.iloc[i,0])

我不妨阅读条理构造,但是我没有晓得怎样将其保留为所需的格局。

推举谜底

不妨应用networkx去处理。注假如应用networkx,则没有须要highest列。查找一切途径的重要函数是all_simple_paths

# Python env: pip install networkx
# Anaconda env: conda install networkx
import networkx as nx

# Create network from your dataframe
#G = nx.from_pandas_edgelist(df, source='parent', target='child',
# create_using=nx.DiGraph)

# For older versions of networkx
G = nx.DiGraph()
for _, (source, target) in df[['parent', 'child']].iterrows():
 G.add_edge(source, target)

# Find roots of your graph (a root is a node with no input)
roots = [node for node, degree in G.in_degree() if degree == 0]

# Find leaves of your graph (a leaf is a node with no output)
leaves = [node for node, degree in G.out_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 a new dataframe
out = pd.DataFrame(paths).fillna('')
out.columns = reversed(out.add_prefix('level ').columns)

输入:

>>> out
  level 三 level 二 level 一 level 0
0 a b c一 a b d e

佳了闭于怎样应用递回记载女子条理构造中的一切路由?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。