我有一个如下数据框
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)
我想获取他直接/间接报告的经理ID和最终员工ID ...假设经理ID 200直接报告144和155并间接报告员工220。所以我想为经理200分别设置3条记录,如下所示输出..其他所有经理ID都这样
想要的输出如下所示
答案 0 :(得分:1)
查找父母/孩子或ID之间的关系与图论有关,因此最好使用Networkx package。您需要通过pip
安装并导入。使用networkx g
创建图from_pandas_edgelist
。对于每位经理,直接在其下有多名员工。但是,假定每个员工只有一名直接经理。因此,我们从Emp_ID
开始。使用Genex(如果需要,也可以使用listcomp)为每个员工调用nx.ancestors
,并将其传递以创建数据框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