添加基于报告的层次结构级别

aim*_*imt 3 python networkx pandas

数据文件

child parent
b     a
c     a
d     b
e     c
f     c
g     f
Run Code Online (Sandbox Code Playgroud)

输出:

child   parent  level
b       a       1
c       a       1
d       b       2
e       c       2
f       c       2
g       f       3
Run Code Online (Sandbox Code Playgroud)

根据此父子报告,“a”是主要父项,因为它不向任何人报告。'b' 和 'c' 向 'a' 报告,因此它们的级别 = 1。'd' 和 'e' 向级别 1 (b,c) 报告,因此它们的级别 =2。'g' 报告给 'f'(这是级别 2),因此级别 = 3 表示 'g'。请让我知道如何实现这一目标

我正在尝试下面的代码,但它不起作用

df['Level'] = np.where(df['parent'] == 'a',"level 1",np.nan)
dfm1 = pd.Series(np.where(df['Level'] == 'level 1', df['parent'],None))
df.loc[df['parent'].isin(dfm1),'Level'] = "level 2"
Run Code Online (Sandbox Code Playgroud)

ank*_*_91 5

这是一种使用networkx我们可以找到没有祖先并获得相同长度的方法

import networkx as nx
Run Code Online (Sandbox Code Playgroud)
G = nx.from_pandas_edgelist(df,"parent","child",create_using=nx.DiGraph())
f = lambda x: len(nx.ancestors(G,x))
df['level'] = df['child'].map(f)
Run Code Online (Sandbox Code Playgroud)
print(df)

  child parent  level
0     b      a      1
1     c      a      1
2     d      b      2
3     e      c      2
4     f      c      2
5     g      f      3
Run Code Online (Sandbox Code Playgroud)