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

2024-10-02 00:43:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个pandas数据框,我想加入到employee\u id中。一个是employee\u Logs,另一个是HR\u Data

员工日志

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

人力资源数据

employee_id  name
2325255      Rob    
51666164     Tom
r1211        Tammy
r18552421    Ron

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

新建\u df

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

如果employee\u id字段在两个表上匹配,我可以做一个简单的连接,但是同一个用户可以在他们的employee 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中有没有一种好的方法可以执行一些where操作并创建一个新的df


Tags: 数据nameiddataonemployeehrlogin
1条回答
网友
1楼 · 发布于 2024-10-02 00:43:20

您可以使用正则表达式从Employee_Logs_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

相关问题 更多 >

    热门问题