我有两个要加入到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字段在两个表上都匹配,我可以进行轻松连接,但是同一用户的员工ID后可以有“ b
”或“ v
”,以指定帐户像管理员帐户一样被提升。某些用户帐户的ID前面有一个“ 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吗?
答案 0 :(得分:3)
您可以使用正则表达式将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