微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 df2 中从 df1 中找到一个值并替换匹配行的其他值

如何解决在 df2 中从 df1 中找到一个值并替换匹配行的其他值

我有以下代码和 2 个数据帧(df1 和 df2)

import pandas as pd

data = {'Name': ['Name1','Name2','Name3','Name4','Name5'],'Number': ['456','A977','132a','6783r','868354']}

replace = {'NewName': ['NewName1','NewName3','NewName4','NewName5','NewName2'],'ID': ['I753','25552','868354','A977']}


df1 = pd.DataFrame(data,columns = ['Name','Number'])
df2 = pd.DataFrame(replace,columns = ['NewName','ID'])

现在我想将 df1 的“Number”列中的每个项目与 df2 的“ID”列中的每个项目进行比较。如果有匹配,我想用df2的'NewName'替换df1的'Name',否则应该保留df1的'Name'。

首先我尝试了以下代码,但不幸的是它混合了不同行中的名称和数字。

df1.loc[df1['Number'].isin(df2['ID']),['Name']] = df2.loc[df2['ID'].isin(df1['Number']),['NewName']].values

我尝试的下一个代码工作得更好,但如果没有匹配,它将用 df1 的“编号​​”替换 df1 的“名称”。

df1['Name'] = df1['Number'].replace(df2.set_index('ID')['NewName'])

如何在我的上一个代码中阻止这种行为,或者一般有没有更好的方法来实现我想要做的事情?

解决方法

您可以使用 map 而不是 replaceNumberdf1 列中的每个值替换为 {{ 中 NewName 列中的相应值1}} 然后 fill df2(不能被替换的值) 映射列中的 NaN 列中的原始值{{ 1}}:

Name

df1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。