如何对比两个DataFrame,仅在指定列变化时更新日期列
解决DataFrame条件更新时保留原日期的问题
你的问题出在np.where的参数逻辑和赋值错误:
- 原代码条件写反:需要在C列存在差异时更新日期,判断条件应为
df1['C'] != df2['C'] - 无差异行的赋值不应是0,而是保留df2原本的D列值
df2['D']
下面提供两种正确实现方式:
方法一:修正np.where的用法
import pandas as pd import numpy as np from datetime import date df1 = pd.DataFrame({"A": ['Apple','Strawberry','Cherry'],"C":['green','red','red'],"D":['2022-08-01','2022-08-01','2022-08-01']}) df2 = pd.DataFrame({"A": ['Apple','Strawberry','Cherry'],"C":['red','red','red'],"D":['2022-08-01','2022-08-01','2022-08-01']}) # 转换当日日期为字符串,和原D列格式统一 today_str = date.today().strftime('%Y-%m-%d') # 条件:C列不同时替换为当日日期,否则保留原日期 df2['D'] = np.where(df1['C'] != df2['C'], today_str, df2['D']) print(df2)
方法二:使用pandas.loc精准更新(推荐)
这种方式仅修改需要更新的行,避免全列赋值,逻辑更直观:
import pandas as pd from datetime import date df1 = pd.DataFrame({"A": ['Apple','Strawberry','Cherry'],"C":['green','red','red'],"D":['2022-08-01','2022-08-01','2022-08-01']}) df2 = pd.DataFrame({"A": ['Apple','Strawberry','Cherry'],"C":['red','red','red'],"D":['2022-08-01','2022-08-01','2022-08-01']}) today_str = date.today().strftime('%Y-%m-%d') # 生成差异行的掩码 mask = df1['C'] != df2['C'] # 仅更新掩码为True的行的D列 df2.loc[mask, 'D'] = today_str print(df2)
两种方法运行后,df2的结果都会符合预期:
A C D 0 Apple red 202X-XX-XX # 当日日期 1 Strawberry red 2022-08-01 2 Cherry red 2022-08-01
内容的提问来源于stack exchange,提问作者teq508
相关产品推荐
相关产品推荐

