рекурсивный поиск python pandas между идентификаторами менеджера и сотрудника - PullRequest
2 голосов
/ 10 ноября 2019

У меня есть датафрейм, как показано ниже

    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

Я хочу получить идентификатор менеджера и окончательный идентификатор сотрудника, о которых он прямо или косвенно сообщает. ... предположим, что идентификатор менеджера 200 напрямую сообщает о 144 и 155 и косвенно сообщает о сотруднике 220. поэтому я хочу иметь 3 отдельные записи для менеджера 200, как показано ниже: например, для других идентификаторов всех менеджеров

Требуемый вывод, как показано ниже

enter image description here

1 Ответ

1 голос
/ 11 ноября 2019

Поиск родителей / детей или отношений между идентификаторами относится к теории графов, поэтому вам лучше использовать пакет Networkx . Вам нужно установить его через pip и импортировать его. Создайте график g, используя сеть x from_pandas_edgelist. Для каждого менеджера есть несколько сотрудников непосредственно под ним / ней. Однако предполагается, что у каждого сотрудника есть только один прямой менеджер. Итак, начнем с Emp_ID. Вызовите nx.ancestors для каждого сотрудника, используя genex (или listcomp, если хотите), и передайте его для создания кадра данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...