我有一个如下所示的数据框
import pandas as pd
import numpy as np
raw_data = {'Emp_ID':[144,220,155,200],
'Mgr_ID': [200, 144,200,500],
'Type': ['O','I','I','I'],
'Location' : ['India','UK','UK','US']
}
df2 = pd.DataFrame(raw_data, columns = ['Emp_ID','Mgr_ID', 'Type','Location'])
print(df2)
Run Code Online (Sandbox Code Playgroud)
我想获得他直接/间接报告的经理ID和最终员工ID...假设经理ID 200直接报告144和155并间接报告员工220。所以我想为经理200有单独的3条记录,如下输出..对于其他所有经理 ID 来说都是如此
想要如下输出
查找父/子或 ID 之间的关系涉及图论,因此您最好使用Networkx 包。您需要通过安装pip并导入它。g使用 networkx创建图表from_pandas_edgelist。对于每个经理来说,他/她的直属员工有多名。然而,每个员工应该只有一名直接经理。所以,我们从 开始Emp_ID。使用genex(或listcomp,如果您愿意)调用nx.ancestors每个员工并将其传递以创建dataframe df3。最后,explode一系列列表Mgr_ID并连接回df2以获得最终输出。
import pandas as pd
import networkx as nx
g = nx.from_pandas_edgelist(df2, source='Mgr_ID', target='Emp_ID', create_using=nx.DiGraph)
df3 = pd.DataFrame(([list(nx.ancestors(g, x)), x] for x in df2.Emp_ID),
index=df2.index, columns=['Mgr_ID', 'Emp_ID'])
df_final = df3.explode('Mgr_ID').join(df2[['Type', 'Location']])
Out[23]:
Mgr_ID Emp_ID Type Location
0 200 144 O India
0 500 144 O India
1 144 220 I UK
1 500 220 I UK
1 200 220 I UK
2 200 155 I UK
2 500 155 I UK
3 500 200 I US
Run Code Online (Sandbox Code Playgroud)