Pandas/Python – создать новый столбец на основе перекрестной ссылки из другого столбца

avatar
ek11222
9 августа 2021 в 05:59
62
2
0

У меня есть набор данных с информацией о сотрудниках. В этом наборе данных соответствующими полями являются столбец EmployeeName, столбец ID и столбец SupervisorName. Я хочу создать новый столбец с именем SupervisorID, который дает нам идентификатор руководителя каждого сотрудника.

Входной кадр данных:

EmployeeName   ID SupervisorName
         Jim  123       Brittany
    Brittany  345           Todd
        Todd  456          Grace

ожидаемый результат:

EmployeeName   ID SupervisorName  SupID
         Jim  123       Brittany    345
    Brittany  345           Todd    456

Я не знаю, как написать это эффективно, я пытался использовать синтаксис np.where() и .iloc[], но я новичок в python и был бы признателен за любую помощь в решении этой проблемы.

Источник

Ответы (2)

avatar
Dean Taler
9 августа 2021 в 06:15
0

вы можете использовать слияние и объединить DataFrame с самим собой

import pandas as pd

data =[{'EmployeeName': 'Jim', 'ID': 123,'SupervisorName': 'Brittany'},
{'EmployeeName': 'Brittany', 'ID': 345,'SupervisorName': 'Todd'},
{'EmployeeName': 'Todd', 'ID': 456,'SupervisorName': 'Grace'}]

df = pd.DataFrame(data)
df_sup = df[['EmployeeName','ID']]
df_sup= df_sup.rename(columns={'EmployeeName': 'SupervisorName', 'ID': 'SupID'})
df = df.merge(right=df_sup, on='SupervisorName', how='inner')
df

выход:

  EmployeeName   ID SupervisorName  SupID
0          Jim  123       Brittany    345
1     Brittany  345           Todd    456
ek11222
9 августа 2021 в 16:49
0

Спасибо, Дин! Это сработало отлично. Я обязательно запомню этот трюк.

avatar
mozway
9 августа 2021 в 06:10
-1

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

df1['SupID'] = df1['SupervisorName'].map(df1.set_index('EmployeeName')['ID'])
df1 = df1.dropna().astype({'SupID': int})

выход:

  EmployeeName   ID SupervisorName  SupID
0          Jim  123       Brittany    345
1     Brittany  345           Todd    456