如何在PYTHON

时间:2018-05-19 18:04:00

标签: python pandas

给定的输入如下:

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”库解决它,那将会很棒。我不确定是否可以使用熊猫来实现。其他解决方案也受到欢迎。

3 个答案:

答案 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与最低层人员相距多少层)。顺便说一下,我使用了递归方法。为了扩展它,我会坚持使用迭代解决方案