Pandas两个含同名start_date列的DataFrame合并时如何保留左表值
问题原因
pd.DataFrame.update() 方法会默认用右侧数据表的同名列值覆盖左侧表的对应值。你的右侧表 right_a 包含 start_date 列,所以左侧 left_a 里的 start_date 不管原有值是空还是有值,都会被右侧的 start_date 统一覆盖,才会得到不符合预期的输出。
解决方案(改动最小,兼容原有逻辑)
只需要在调用update方法时,仅指定更新你需要的x2列,不处理start_date列即可,修改后的完整代码如下:
import pandas as pd df_prep = pd.DataFrame({ 'offr_id': ['1', '1', '2', '2'], 'mbr_id' : ['10','11','12','13'], 'start_date': ['', '','2021-09-01', '2021-09-01'] }) df_map_grocery = pd.DataFrame({ 'offr_id': ['1', '2'], 'x2': ['a', 'b'], 'start_date': ['2021-09-06', '2021-09-06'] }) left_a = df_prep.set_index('offr_id') right_a = df_map_grocery.set_index('offr_id') df_prep = left_a.reindex(columns=left_a.columns.union(right_a.columns)) # 仅更新x2列,保留原有start_date不被覆盖 df_prep.update(right_a[['x2']]) df_prep.reset_index(inplace=True)
运行后即可得到你需要的目标输出。
可选优化方案:用merge实现逻辑更清晰
如果你不想用update方法,也可以用左连接merge的方式,明确指定只合并需要的x2列,代码更简洁易读:
df_prep = df_prep.merge(df_map_grocery[['offr_id', 'x2']], on='offr_id', how='left')
内容的提问来源于stack exchange,提问作者ddss12
相关产品推荐
相关产品推荐

