查找树中的所有后代

时间:2018-07-09 13:17:21

标签: python pandas networkx

我有一个df,例如:

d = {'Parent': ['abc', 'abc', 'def', 'mno'], 'Child': ['def', 'ghi', 'jkl', 'pqr']}
df = pd.DataFrame(data=d)

,并希望获得一个df,例如:

d2 = {'Ancestor': ['abc', 'abc', 'abc', 'mno'], 'Descendant': ['def', 'ghi', 'jkl', 'pqr']}
df2 = pd.DataFrame(data = d2)

其中abcmno是唯一的祖先,其余被列为各自祖先的后代。

到目前为止,我已经尝试过networkx,但是没有任何运气。

编辑:该示例仅显示三层,但树结构可以是任意数量的层。

1 个答案:

答案 0 :(得分:2)

我认为您可以使用带定向图的newtorkx来做到这一点:

import pandas as pd
import networkx as nx

d = {'Parent': ['abc', 'abc', 'def', 'mno'], 'Child': ['def', 'ghi', 'jkl', 'pqr']}
df = pd.DataFrame(data=d)
dG = nx.from_pandas_edgelist(df, 'Parent', 'Child', create_using=nx.DiGraph())
df2 = pd.DataFrame({'Ancenstor':[[i for i in nx.ancestors(dG,i) if i not in df['Child'].tolist()][0] for i in df.Child],
          'Descendent':df['Child']})

df2 

输出:

  Ancenstor Descendent
0       abc        def
1       abc        ghi
2       abc        jkl
3       mno        pqr