Pandas更新DataFrame时保留指定列原有值的实现方法
问题描述
我有两个DataFrame,希望用新DataFrame更新旧DataFrame,但需保留部分指定列(此处为value列)的原有值。示例数据如下:
示例代码
import numpy as np import pandas as pd data_old = {'name': ['name1', 'name2', 'name3'], 'datetime': ['2022-10-25 14:00', '2022-10-10 00:00', np.nan], 'value': [1, 2, np.nan]} data_new = {'name': ['name1', 'name2', 'name2', 'name3'], 'datetime': ['2022-10-25 14:00', '2022-10-10 00:00', '2022-10-10 01:00', '2022-10-10 22:00'], 'value': [1, 3, 10, 8]} df_old = pd.DataFrame(data=data_old) df_new = pd.DataFrame(data=data_new)
旧DataFrame(df_old)
name datetime value 0 name1 2022-10-25 14:00 1.0 1 name2 2022-10-10 00:00 2.0 2 name3 NaN NaN
新DataFrame(df_new)
name datetime value 0 name1 2022-10-25 14:00 1 1 name2 2022-10-10 00:00 3 2 name2 2022-10-10 01:00 10 3 name3 2022-10-10 22:00 8
直接使用df_old.merge(df_new, how='right')会覆盖value列的值,请问如何在更新其他列的同时,保留已存在的value列旧值,得到如下目标结果?
目标结果
name datetime value 0 name1 2022-10-25 14:00 1 1 name2 2022-10-10 00:00 2 2 name2 2022-10-10 01:00 10 3 name3 2022-10-10 22:00 8
解决方案
核心思路是先通过**匹配键(name+datetime)**合并新旧DataFrame,再优先保留旧DataFrame的value值,仅在旧值不存在时使用新值。具体步骤如下:
- 合并DataFrame:以
name和datetime为连接键,使用right连接保留新DataFrame的所有行,同时关联旧DataFrame的对应数据:
merged = df_new.merge(df_old, on=['name', 'datetime'], how='right', suffixes=('_new', '_old'))
- 保留旧值并填充新值:用旧DataFrame的
value_old覆盖新DataFrame的value_new(仅当旧值存在时),最后整理列格式:
merged['value'] = merged['value_old'].combine_first(merged['value_new']) result = merged[['name', 'datetime', 'value']].astype({'value': int})
- 查看结果:
print(result)
输出结果与目标完全一致:
name datetime value 0 name1 2022-10-25 14:00 1 1 name2 2022-10-10 00:00 2 2 name2 2022-10-10 01:00 10 3 name3 2022-10-10 22:00 8
补充说明
combine_first()方法会优先取左侧(旧值)的非空数据,仅当左侧为空时才使用右侧(新值),精准匹配需求。- 如果需要保留多个指定列的旧值,只需对每个列重复上述逻辑即可。
内容的提问来源于stack exchange,提问作者zxdawn
相关产品推荐
相关产品推荐

