Pandas两个DataFrame按name列匹配替换对应Code列值的问题
错误原因
df.replace()默认会扫描整个DataFrame的所有单元格,只要单元格值匹配字典的键就会执行替换,所以你name列的1234567刚好命中字典的键,被错误替换为了H74,原代码没有指定替换规则仅作用于Code列、且匹配条件是name列的值相等。
正确实现方案
方案1:使用map方法(最简单高效)
注意不要用dict作为变量名,这是Python内置关键字,会覆盖原生功能:
# 构建name到Code的映射字典 code_map = df1.set_index('name')['Code'].to_dict() # 按name列匹配映射Code值,未匹配到的保留df2原有Code df2['Code'] = df2['name'].map(code_map).fillna(df2['Code'])
方案2:使用merge方法(适合多字段匹配的复杂场景)
# 左连接合并两个DataFrame,区分不同来源的Code列 df2 = df2.merge(df1, on='name', how='left', suffixes=('', '_df1')) # 优先取df1的Code,未匹配到的用df2原有Code填充 df2['Code'] = df2['Code_df1'].fillna(df2['Code']) # 删除合并产生的多余列 df2.drop('Code_df1', axis=1, inplace=True)
两种方案执行后都可以得到你预期的结果:
| name | Code |
|---|---|
| 1234567 | H74 |
| 1234321 | J12 |
内容的提问来源于stack exchange,提问作者jnord
相关产品推荐
相关产品推荐

