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

对比两个DataFrame并处理含NaN的比较,更新date列

问题:按规则更新DataFrame的日期列

现有两个DataFrame df_base 与 df_upd,二者name列包含共同取值(A、B、C、D),df_base 额外包含取值E。需按name匹配对比两表的value列,并按以下规则更新df_base的date列:

  • 当value完全相同时(包括均为NaN),date保留原值;
  • 其余差异场景(一方为NaN另一方非NaN、取值不同),date更新为当前日期。

示例数据

import pandas as pd
import numpy as np
import datetime as dt

df_base = pd.DataFrame({
    'name': ['A','B','C','D','E'],
    'value': ['x', 'y',np.nan,'x',np.nan],
    'date': ['01-01-1980','01-01-1980',np.nan,'01-01-1980',np.nan]})

df_upd = pd.DataFrame({
    'name': ['A','B','C','D'],
    'value': ['x', np.nan,'x','y']})

对比规则示例

namevalue (df_base)value (df_upd)date (old)date(new)
Axx01-01-198001-01-1980
Bynp.nan01-01-1980dt.date.today()
Cnp.nanxnp.nandt.date.today()
Dxy01-01-1980dt.date.today()
Enp.nannp.nannp.nannp.nan

解决方案代码

# 合并两表,按name匹配并保留df_base所有行
merged = df_base.merge(df_upd, on='name', how='left', suffixes=('_base', '_upd'))

# 判断value是否一致(包含均为NaN的情况)
same_value = np.where(
    pd.isna(merged['value_base']) & pd.isna(merged['value_upd']),
    True,
    merged['value_base'] == merged['value_upd']
)

# 按规则更新date列,日期格式与示例统一
today = dt.date.today().strftime('%m-%d-%Y')
df_base['date'] = np.where(same_value, df_base['date'], today)

# 清理临时数据
del merged

最终结果

# 更新后的df_base:
df_base = pd.DataFrame({
    'name': ['A','B','C','D','E'],
    'value': ['x', 'y',np.nan,'x',np.nan],
    'date': ['01-01-1980', today, today, today, np.nan]})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:22:46