给定的输入如下:
EMPLOYEE_ID NAME MANAGER_ID
101 A 10
102 B 11
10 C 1
11 D 1
1 E null
Employee Cycle LEVEL Path
101 A 101/10/1
102 B 102/11/1
10 C 10/1
11 D 11/1
1 E 1
如果可以使用python“pandas”库解决它,那将会很棒。我不确定是否可以使用熊猫来实现。其他解决方案也受到欢迎。
答案 0 :(得分:1)
dictionary
EMPLOYEE_ID
和 MANAGER_ID
:
dct = dict(zip(df.EMPLOYEE_ID.values, df.MANAGER_ID.values))
function
创建层次结构字符串
def heirarchy(id):
boss = str(id) + '/'
while dct[id] != 'null':
boss += dct[id] + '/'
id = int(dct[id])
return boss[:-1]
<强> apply
强>
df['LEVEL'] = df.EMPLOYEE_ID.apply(heirarchy)
# Result
EMPLOYEE_ID NAME MANAGER_ID LEVEL
0 101 A 10 101/10/1
1 102 B 11 102/11/1
2 10 C 1 10/1
3 11 D 1 11/1
4 1 E null 1
答案 1 :(得分:1)
您可以创建将子项映射到父项的字典。
然后使用pd.Series.apply
通过while
循环构建路径字符串。
注意我认为null
实际上意味着NaN
,这对数字列更有意义。
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)
print(df)
# EMPLOYEE_ID NAME MANAGER_ID Path
# 0 101 A 10 101/10/1
# 1 102 B 11 102/11/1
# 2 10 C 1 10/1
# 3 11 D 1 11/1
# 4 1 E NaN 1
答案 2 :(得分:0)
我发现user3483203使用的方法/方法非常简洁明了。该代码很容易遵循。我唯一要添加的是代替返回“ /”定界字符串的函数,而是输出一个本地的python结构(如列表)。像这样:
def get_managerial_hierarchy(employee_id, manager_list=None):
if manager_list == None:
manager_list = []
manager_list.append(employee_id)
employee_id = parent_child[employee_id]
if employee_id != '':
get_managerial_hierarchy(employee_id, manager_list)
return manager_list
输出将如下所示:
['101', '10', '1']
['102', '11', '1']
['10', '1']
['11', '1']
['1']
如有必要,您始终可以包装/更改列表,以符合所需的输出。但是,现在您可以使用len()函数轻松地量化管理层次的距离/级别(CEO与最低层人员相距多少层)。顺便说一下,我使用了递归方法。为了扩展它,我会坚持使用迭代解决方案