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

基于另一DataFrame匹配替换值时Merge未达预期结果

解决方案:用df2填充df1的缺失日期值

你的需求是保留df1中Date列的非空值,仅用df2中对应old_index的Date值填充df1的NaT缺失值。之前的right merge会生成两个日期列且未完成填充逻辑,以下是两种可行的实现方法:

方法1:使用combine_first(推荐)

该方法可直接对齐索引,优先保留原df1的非空值,仅填充缺失部分:

import pandas as pd

# 将df2转换为以old_index为索引的日期Series
df2_date_map = df2.set_index('old_index')['Date']

# 对齐df1的索引,填充缺失值
result_df = df1.set_index('old_index').combine_first(df2_date_map).reset_index()

方法2:Merge后合并列

先通过left merge保留df1的原有行结构,再用df2的日期填充缺失值:

import pandas as pd

# 左连接保留df1的所有行
merged = pd.merge(df1, df2, how='left', on='old_index')
# 用df2的Date填充df1的NaT,保留原非空值
merged['Date'] = merged['Date_x'].fillna(merged['Date_y'])
# 删除多余列,得到目标结果
result_df = merged.drop(columns=['Date_x', 'Date_y'])

验证结果

两种方法都会得到你期望的输出:

old_index       Date
0   3               2019-10-23
1   19              2019-12-05
2   29              2019-11-12
3   32              2021-11-19
4   34              2019-12-05
5   116             2020-03-24
6   118             2020-01-29

补充说明

  • 你之前使用how="right"的问题:右连接会以df2的行结构为基准,不符合你保留df1原有行顺序和结构的需求,改用left连接更贴合场景。
  • combine_first是更简洁的方式,它会自动匹配索引(这里是old_index),优先使用左侧DataFrame的值,仅当左侧值缺失时才用右侧值填充。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:28:25