Это расширенный вопрос к этому Вопросу
Я использовал тот же самый 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)))))
ЛюбойМысли и предложения будут оценены.
Спасибо,
Кролик.