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

Kum*_* AK 5 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想获得他直接/间接报告的经理ID和最终员工ID...假设经理ID 200直接报告144和155并间接报告员工220。所以我想为经理200有单独的3条记录,如下输出..对于其他所有经理 ID 来说都是如此

想要如下输出

在此输入图像描述

And*_* L. 4

查找父/子或 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)