在大熊猫的树中找到所有叶节点的祖先

时间:2018-12-26 18:37:54

标签: python python-3.x pandas dataframe tree

我有一个包含两列的表,“父母”和“孩子”。这是从SAP(ERP)下载的SETNODE表。需要在python中创建一个数据框,该数据框具有相对于其父级以及之前的所有级别的每个级别,因为它是自己的列。

在python 3+中。

完整关系的级别数未知(或始终在变化),因此无法始终定义最大级别。我想创建一个完整的数据框表,以显示所有级别的所有父/子关系。现在大约是15个级别,但与我一起使用的其他数据可能会增加到20个或更多。

例如两列中的(example_df):

enter image description here

example_df = pd.DataFrame({'parent:['a','a','b','c','c','f'],'child':['b','c','d','f','g','h']})

给出输出数据框(solution_example):

enter image description here

solution_example = pd.DataFrame({'child':['h','f','d'],'parent_1':['a','a','a'],'parent_2':['c','c','b'],'parent_3':['f', 'none', 'none']})

1 个答案:

答案 0 :(得分:2)

这可以使用networkx库解决。首先,从DataFrame构建有向图,然后找到叶节点的所有祖先。

import networkx as nx

leaves = set(df.child).difference(df.parent)
g = nx.from_pandas_edgelist(df, 'parent', 'child', create_using=nx.DiGraph())
ancestors = {
    n: nx.algorithms.dag.ancestors(g, n) for n in leaves
}

(pd.DataFrame.from_dict(ancestors, orient='index')
   .rename(lambda x: 'parent_{}'.format(x+1), axis=1)
   .rename_axis('child')
   .fillna(''))

      parent_1 parent_2 parent_3
child                           
h            a        c        f
g            a        c         
d            a        b