Как написать Иерархический запрос в PYTHON - PullRequest
0 голосов
/ 19 мая 2018

Заданный ввод выглядит как:

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".Я не уверен, что это может быть достигнуто с помощью панд или нет.Другие решения также приветствуются.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вы можете создать словарь, сопоставляющий дочерние элементы с родителями.

Затем используйте 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
0 голосов
/ 19 мая 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...