Сопоставление строк между столбцами и создание нового столбца, если строки совпадают в pandas - PullRequest
0 голосов
/ 17 марта 2020

Если у меня есть следующий фрейм данных (df)

emp_id  email_ad                    full_nm             mgr_emp_id
65391   Pierric.Beckert@email.com   Pierric Beckert     57834
65392   Mat.Yokoyama@email.com      Mat Yokoyama        92499
65393   Kevin.Harvey@email.com      Kevin Harvey        45325

Для каждой строки в mgr_emp_id, если mgr_emp_id совпадает с идентификатором сотрудника в emp_id, тогда создайте новый столбец с именем Manager_Name, получив имя из столбца full_nm.

Я попробовал следующее, но я не уверен, как вызвать функцию

def mgr1(row):
    for row in df['mgr_emp_id']:
        if row['mgr_emp_id'] == row['emp_id']:
            df['Manager Name']=row['full_nm']

Я попытался вызвать ее так:

df.apply(lambda row: mgr1(row),axis=1)

Но я получил ошибка:

Ошибка типа: объект 'float' не является подписным

Если есть лучший способ добиться того, что я пытаюсь сделать, пожалуйста, любая помощь будет оценена: )

1 Ответ

0 голосов
/ 17 марта 2020

Если я правильно понимаю ваш вопрос, ваш wi sh «создать новый столбец» для каждого экземпляра совпадающих идентификаторов будет запутан. Предположительно, вам нужен дополнительный столбец под названием «Управление именем», и если emp_id соответствует mgr_emp_id, вы хотите, чтобы full_nm равнялось «Управлять именем». Очевидно, что при наличии неравенства вы не будете знать имя управления.

Чтобы достичь этого, вы можете просто создать новый столбец значений NAN, отфильтровать строки, где emp_id соответствует mgr_emp_id, и заменить Значение NAN со значением этой строки full_nm для этих строк.

df = pd.DataFrame([
    [65391, 'Pierric.Beckert@email.com', 'Pierric Beckert', 57834],
    [65392, 'Mat.Yokoyama@email.com', 'Mat Yokoyama', 92499],
    [65393, 'Kevin.Harvey@email.com', 'Kevin Harvey', 45325],
    [11111, 'example.same@email.com', 'Example Same', 11111]],
    columns=['emp_id', 'email_ad', 'full_nm', 'mgr_emp_id'])

df['manager_name'] = np.nan

df.loc[df.emp_id.eq(df.mgr_emp_id), 'manager_name'] = df.full_nm

В последней строке мы используем loc, чтобы найти строки, в которых emp_id соответствует mgr_emp_id, и интересующий столбец ("manager_name") и введите значение в этот элемент dataframe, заменив NAN.

Результат:

    emp_id  email_ad                    full_nm         mgr_emp_id  manager_name
0   65391   Pierric.Beckert@email.com   Pierric Beckert 57834       NaN
1   65392   Mat.Yokoyama@email.com      Mat Yokoyama    92499       NaN
2   65393   Kevin.Harvey@email.com      Kevin Harvey    45325       NaN
3   11111   example.same@email.com      Example Same    11111       Example Same

Если вы хотите сделать что-то другое, я думаю, вы бы Вам нужны либо отдельные кадры данных, либо другой формат данных.

...