对比两个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']})
对比规则示例
| name | value (df_base) | value (df_upd) | date (old) | date(new) |
|---|---|---|---|---|
| A | x | x | 01-01-1980 | 01-01-1980 |
| B | y | np.nan | 01-01-1980 | dt.date.today() |
| C | np.nan | x | np.nan | dt.date.today() |
| D | x | y | 01-01-1980 | dt.date.today() |
| E | np.nan | np.nan | np.nan | np.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
相关产品推荐
相关产品推荐

