You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于第二个DataFrame替换Pandas列值(已尝试StackOverflow方案无效)

解决DataFrame按User_ID替换列值的问题

嘿,我明白你遇到的麻烦了——尝试了两种方法都没成功,确实挺让人头疼的。先帮你梳理下之前两种方法的问题,再给你靠谱的解决方案:

先明确你的数据情况

先把你的示例数据用代码还原下,方便大家理解:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'User_ID': [123, 345, 567],
    'Code_1': ['htrh', np.nan, 'cewr']
})

df2 = pd.DataFrame({
    'User_ID': [123, 345],
    'Code_2': ['ert', 'nad']
})

为什么你之前的方法无效?

  • 第一种方法:df1['Code_1'] = df1['User_ID'].replace(df2.set_index('User_ID')['Code_2'])
    这里你是对User_ID列执行replace操作,把User_ID的值替换成Code_2,然后赋值给Code_1,逻辑完全错了,自然得不到想要的结果。

  • 第二种方法:df1.loc[df1.User_ID.isin(df2.User_ID), ['Code_1']] = df2[['Code_2']]
    这个方法的问题在于索引不匹配:df2的行索引是0、1,而df1中匹配的User_ID对应的行索引可能和df2不一致(比如如果df1的顺序调整,就会直接赋值错误),pandas的赋值是按索引对齐的,所以会导致替换失败。

正确的解决方案

这里给你两种简单可靠的方法:

方法1:使用map + fillna

先把df2转换成User_ID到Code_2的映射关系,然后用df1的User_ID去匹配,最后保留原有的Code_1值(df2中没有的User_ID就不替换):

# 构建User_ID到Code_2的映射字典
code_map = df2.set_index('User_ID')['Code_2']
# 用map匹配对应值,没有匹配到的用原Code_1填充
df1['Code_1'] = df1['User_ID'].map(code_map).fillna(df1['Code_1'])

执行后df1的结果就是:

User_IDCode_1
123ert
345nad
567cewr

方法2:使用merge合并后赋值

先把两个DataFrame按User_ID左连接,然后用Code_2替换Code_1,没有匹配到的保留原值:

# 左连接两个DataFrame,保留df1的所有行
merged_df = df1.merge(df2, on='User_ID', how='left')
# 替换Code_1:优先用Code_2的值,没有的话保留原Code_1
df1['Code_1'] = merged_df['Code_2'].combine_first(merged_df['Code_1'])

这个方法更直观,适合需要查看中间合并结果的场景。

这两种方法都能完美解决你的需求,你可以根据自己的习惯选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:55