Determinar el nivel de los empleados para cada día

pythonnewbie:

Estoy tratando de determinar la profundidad de un empleado en la organización de cada día. El nivel superior (CEO) es el nivel 1, sus subordinados directos son de nivel 2, etc.

Yo era capaz de calcular w / o fecha, pero tiene problemas para calcular el nivel de los empleados para cada día. Esto es lo que he hecho:

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)

salida de corriente

Rendimiento esperado

Serge Ballesta :

Se puede usar un GroupBy y pasar el dctdict por día:

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

Da como se esperaba:

        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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=387932&siteId=1
Recomendado
Clasificación