添加基于报告的层次结构级别
数据文件
child parent b a c a d b e c f c g f
输出:
child parent level
b a 1
c a 1
d b 2
e c 2
f c 2
g f 3
根据此父子报告,“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"
回答
这是一种使用networkx我们可以找到没有祖先并获得相同长度的方法
import networkx as nx
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)
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