Определить уровень сотрудника на каждый день - PullRequest
3 голосов
/ 30 марта 2020

Я пытаюсь определить глубину сотрудника в организации по дням. Верхний уровень (генеральный директор) - уровень 1, их прямые отчеты - уровень 2 и т. Д. c.

Мне удалось вычислить без даты, но возникли проблемы с вычислением уровня сотрудника для каждого дня. Вот что я сделал:

import pandas as pd

# setup df
df = pd.DataFrame({'date': ['3/29/2020', '3/29/2020', '3/29/2020', '3/30/2020', '3/30/2020', '3/30/2020', '3/30/2020'],
                   'empid': [1, 2, 3, 1, 2, 3, 4], 'mgrid': [0, 1, 2, 0, 1, 1, 2]})

# create dictionary
dct = dict(zip(df['empid'].values, df['mgrid'].values))

# function to create employee level
def level(empid):
    top = 1
    while (dct[empid]) != 0:
        top += 1
        empid = dct[empid]
    return top

#apply level
df['level'] = df['empid'].apply(level)

current output

expected output

1 Ответ

2 голосов
/ 30 марта 2020

Вы можете использовать групповую передачу и передавать dct дикт в день:

def level(empid, dct):
    top = 1
    while (dct[empid]) != 0:
        top += 1
        empid = dct[empid]
    return top

def dflevel(x):
    dct = dict(zip(x['empid'].values, x['mgrid'].values))
    return x['empid'].apply(level, args=[dct])

df['level'] = df.groupby('date').apply(dflevel).values

Это дает, как и ожидалось:

        date  empid  mgrid  level
0  3/29/2020      1      0      1
1  3/29/2020      2      1      2
2  3/29/2020      3      2      3
3  3/30/2020      1      0      1
4  3/30/2020      2      1      2
5  3/30/2020      3      1      2
6  3/30/2020      4      2      3
...