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

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值,仅在旧值不存在时使用新值。具体步骤如下:

  1. 合并DataFrame:以name和datetime为连接键,使用right连接保留新DataFrame的所有行,同时关联旧DataFrame的对应数据:
merged = df_new.merge(df_old, on=['name', 'datetime'], how='right', suffixes=('_new', '_old'))
  1. 保留旧值并填充新值:用旧DataFrame的value_old覆盖新DataFrame的value_new(仅当旧值存在时),最后整理列格式:
merged['value'] = merged['value_old'].combine_first(merged['value_new'])
result = merged[['name', 'datetime', 'value']].astype({'value': int})
  1. 查看结果:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:22:59