基于另一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
相关产品推荐
相关产品推荐

