猿问

在具有相似但不精确值的列上连接数据框

我有两个要加入到employee_id 的pandas 数据框。一个是 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

我想加入他们,使数据看起来像这样:


新建_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”,以指定该帐户是否像管理员帐户一样被提升。一些用户帐户r在 id 前面有一个“ ”,但在两个表中都是这种情况。


在 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 中有什么好方法可以让我做一些 where 操作并创建一个新的 df?


一只甜甜圈
浏览 152回答 1
1回答

紫衣仙女

您可以使用正则表达式从employee_idin 中删除尾随字母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   name0    2325255b   login    Rob1    51666164   login    Tom2   51666164v   login    Tom3       r1211  logoff  Tammy4   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   name0    2325255b   login    Rob1    51666164   login    Tom2   51666164v   login    Tom3       r1211  logoff  Tammy4   r18552421   login    Ron
随时随地看视频慕课网APP

相关分类

Python
我要回答