Получить всех менеджеров сотрудника с помощью Python - PullRequest
0 голосов
/ 26 марта 2019

Это расширенный вопрос к этому Вопросу

Я использовал тот же самый DataFrame,

df = pd.DataFrame(
data = {'EMPLOYEE_ID':[101,102,10,11,1],
        'NAME':['A','B','C','D','E'],
        'MANAGER_ID':[10,11,101,1,None]},
         columns=['EMPLOYEE_ID','NAME','MANAGER_ID'])
df = df.replace('', np.nan)

и, ссылаясь на ответ @jpp, я получаюжелаемый результат.

child_parent_dict = df.set_index('EMPLOYEE_ID')['MANAGER_ID'].to_dict()

def get_all_parents(child):
"""Get all parents from hierarchy structure"""
while child == child:
    child = child_parent_dict[child]
    if child == child:
        yield int(child)

def get_path(x):
"""Calculate path and construct string"""
return '/'.join(list(map(str, [x]+list(get_all_parents(x)))))

df['Path'] = df['EMPLOYEE_ID'].apply(get_path)

Но затем я натолкнулся на несколько угловых случаев.

Приведенный ответ потерпел неудачу, когда

  • '101' Emp сообщает'10' Manager и '10' Emp сообщает '101'
  • , когда EmpID 102 сообщает 11, но 11 EmpID сообщает себе.

DataFrame выглядит следующим образом.

df = pd.DataFrame(
data = {'EMPLOYEE_ID':[101,102,10,11,1],
        'NAME':['A','B','C','D','E'],
        'MANAGER_ID':[10,11,101,11,None]},
columns=['EMPLOYEE_ID','NAME','MANAGER_ID'])

Да, похоже на проблему с данными, но все-таки данные генерируются вручную или на машинах.Таким образом, могут быть шансы получения данных, как указано выше.Наша задача - также запустить наш сценарий для этих угловых случаев.

Чтобы решить эту проблему, есть две возможности:

  • Исключить запись этого сотрудника
  • Просто получите идентификатор сотрудника, но его менеджеры

Я пытался исключить запись сотрудника, изменив функцию получения сотрудников, но не смог сделать это полностью.

EmpList = []
def get_all_parents(child):
"""Get all parents from hierarchy structure"""
while child == child:
    print(child_parent_dict[child])
    child = child_parent_dict[child]
    print(child)
    if (child == child and child != 'None'):
        EmpList.append(child)
        print(EmpList)
        yield str(child)
        print(child)
        for i in range(len(EmpList)):
            if len(EmpList) >=3 and (EmpList[0] == EmpList[2]):
                break
    else:
        EmpList.clear()

def get_path(x):
"""Calculate path and construct string"""
print('|'.join(list(map(str, [x]+list(get_all_parents(x))))))
return '|'.join(list(map(str, [x]+list(get_all_parents(x)))))

ЛюбойМысли и предложения будут оценены.

Спасибо,

Кролик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...