我有一个包含两列的表,“父母”和“孩子”。这是从SAP(ERP)下载的SETNODE表。需要在python中创建一个数据框,该数据框具有相对于其父级以及之前的所有级别的每个级别,因为它是自己的列。
在python 3+中。
完整关系的级别数未知(或始终在变化),因此无法始终定义最大级别。我想创建一个完整的数据框表,以显示所有级别的所有父/子关系。现在大约是15个级别,但与我一起使用的其他数据可能会增加到20个或更多。
例如两列中的(example_df):
example_df = pd.DataFrame({'parent:['a','a','b','c','c','f'],'child':['b','c','d','f','g','h']})
给出输出数据框(solution_example):
solution_example = pd.DataFrame({'child':['h','f','d'],'parent_1':['a','a','a'],'parent_2':['c','c','b'],'parent_3':['f', 'none', 'none']})
答案 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