经理和员工ID之间的python pandas递归查找

时间:2019-11-10 18:09:15

标签: python-3.x pandas

我有一个如下数据框

    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)

enter image description here

我想获取他直接/间接报告的经理ID和最终员工ID ...假设经理ID 200直接报告144和155并间接报告员工220。所以我想为经理200分别设置3条记录,如下所示输出..其他所有经理ID都这样

想要的输出如下所示

enter image description here

1 个答案:

答案 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