gpt4 book ai didi

python - 在具有相似但不精确值的列上加入 Dataframes

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:34 24 4
gpt4 key购买 nike

我有两个 pandas 数据框,我想加入 employee_id。一个是 Employee_Logs,另一个是 HR_Data。

员工日志_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”员工 ID 以指定帐户是否像管理员帐户一样被提升。一些用户帐户在 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?

最佳答案

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

关于python - 在具有相似但不精确值的列上加入 Dataframes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53561982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com