aim*_*imt 3 python networkx pandas
数据文件
Run Code Online (Sandbox Code Playgroud)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
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)
这是一种使用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)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |