Объединение Dataframes в столбцах с похожими, но не точными значениями - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть два кадра данных панд, к которым я хочу присоединиться по employee_id.Один - Employee_Logs, другой - HR_Data.

Employee_Logs_df

employee_id  action
2325255b     login     
51666164     login
51666164v    login
r1211        logoff
r18552421    login

HR_Data_df

employee_id  name
2325255      Rob    
51666164     Tom
r1211        Tammy
r18552421    Ron

Я хочу присоединиться к ним, чтобы данные выглядели так:

New_df

employee_id  action  name
2325255b     login   Rob  
51666164     login   Tom
51666164v    login   Tom
r1211        logoff  Tammy
r18552421    login   Ron

Я мог бы сделать простое объединение, если бы поле employee_id совпало в обеих таблицах, но у одного и того же пользователя может быть "b" или "v" после ихидентификатор сотрудника, чтобы указать, будет ли учетная запись повышена как учетная запись администратора.У некоторых учетных записей перед идентификатором есть «r», но в обеих таблицах это так.

В SQL это дает мне желаемые результаты:

select el*,
    coalesce(h.name, hv.name, hb.name) as name
from employee_logs el left join
    hr_data h
    on el.employee_id = h.employee_id left join
    hr_data hv
    on el.employee_id = concat(h.employee_id, 'v') left join
    hr_data hb
    on el.employee_id = concat(h.employee_id, 'b');

Есть ли хороший способ в Python, где я могу выполнить некоторые действия и создать новый df?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете удалить конечную букву из employee_id в Employee_Logs_df с помощью регулярного выражения, а затем сопоставить ее с вашими именами из HR_Data_df:

new_df = Employee_Logs_df.assign(name = Employee_Logs_df.employee_id
                                 .str.extract('(.*\d+)',expand=False)
                                 .map(HR_Data_df.set_index('employee_id')['name']))

>>> new_df
  employee_id  action   name
0    2325255b   login    Rob
1    51666164   login    Tom
2   51666164v   login    Tom
3       r1211  logoff  Tammy
4   r18552421   login    Ron

Вы можете сделать что-то очень похожее с помощью слиянияесли вы хотите:

new_df = Employee_Logs_df.merge(HR_Data_df.set_index('employee_id'),
                                left_on=Employee_Logs_df.employee_id
                                .str.extract('(.*\d+)',expand=False),
                                right_index=True)

>>> new_df
  employee_id  action   name
0    2325255b   login    Rob
1    51666164   login    Tom
2   51666164v   login    Tom
3       r1211  logoff  Tammy
4   r18552421   login    Ron
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...