У меня есть два кадра данных pandas, которые я хочу присоединиться к 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?
Вы можете HR_Data_df
букву от employee_id
с помощью регулярного выражения, а затем сопоставить это с вашими именами из 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