You need to enable JavaScript to run this app. Pandas 实现df1.Number与df2.ID匹配后替换对应行Name值
优惠活动
大模型
产品
解决方案
定价
更多

Pandas 实现df1.Number与df2.ID匹配后替换对应行Name值

问题解决

测试基础代码

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', '6783r', '868354', 'A977']}

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

核心需求

将df1的Number列值与df2的ID列逐一匹配:

  • 匹配成功时,将对应行的Name值替换为df2中匹配行的NewName值
  • 匹配失败时,保留df1原有的Name值

原方案的问题根因

第一种isin + loc方案的错配问题

该方案错配的核心原因是:两个DataFrame通过isin筛选出的匹配子集,行顺序并未按匹配关系对齐:

  • df1筛选出的匹配行,按df1自身的原有行顺序排列
  • df2筛选出的匹配行,按df2自身的原有行顺序排列
    直接将df2筛选出的NewName值按位置赋值给df1的匹配行,会因为两边顺序不对应出现行值错配。

第二种replace + set_index方案的未匹配值错误

该方案未匹配行被替换为Number值的核心原因是两处逻辑疏漏:

  1. 代码直接将Number列经过替换后的全量结果赋值给Name列,完全覆盖了原有Name列的存储值
  2. replace方法遇到没有映射关系的元素时,会默认保留元素本身(即Number列的原始值),最终导致未匹配行的Name值变成了对应的Number值,而非原有Name值。

方案修正与实现

你之前构建的ID到NewName的映射字典本身逻辑完全正确,问题只出在对映射结果的处理上

修正原replace方案

只需要补充未匹配值的填充规则即可:

# 构建正确的ID到NewName映射
id_name_map = df2.set_index('ID')['NewName']
# 用Number列做映射,未匹配的位置用原Name值填充
df1['Name'] = df1['Number'].map(id_name_map).fillna(df1['Name'])
  • map方法只会返回匹配到的NewName值,未匹配的位置返回NaN
  • 通过fillna将NaN位置替换为df1原本的Name值,就可以完全符合需求
    如果要保留原来用replace的写法,也可以加一层判断逻辑:
id_name_map = df2.set_index('ID')['NewName']
df1['Name'] = df1['Number'].replace(id_name_map).where(
    cond=df1['Number'].isin(id_name_map.index), 
    other=df1['Name']
)

更稳妥的实现:左连接匹配

对于按键匹配的场景,用merge做左连接是最不容易出现对齐问题的方案,不需要手动处理顺序匹配问题:

# 左连接:保留df1所有行,按Number=ID的规则匹配df2的内容
df_merged = df1.merge(df2, left_on='Number', right_on='ID', how='left')
# 匹配到的NewName填充到Name列,未匹配的保留原Name
df_merged['Name'] = df_merged['NewName'].fillna(df_merged['Name'])
# 清理合并产生的临时列
df1 = df_merged.drop(columns=['NewName', 'ID'])

执行后预期结果

修正后的df1结果为:

NameNumber
Name1456
NewName2A977
Name3132a
NewName46783r
NewName5868354

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 00:54:07