使用pandas的update方法时对比两个DataFrame日期实现条件更新
Pandas 按日期条件实现DataFrame更新的解决方案
首先你需要先把两个DataFrame的Date列转换为datetime类型,避免字符串直接比较出现逻辑错误,之后可以通过两种方式实现你的需求:
方法1:过滤df2有效行后执行update(更直观易理解)
先筛选出df2中满足日期大于df1同PC对应日期的行,再执行更新操作,update方法会自动跳过不存在的索引和NaN值,不会修改df1中不符合条件的行:
import pandas as pd # 1. 转换日期列为datetime类型,保证比较逻辑正确 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) # 2. 设置PC为索引(你已经完成的步骤) df1.set_index('PC', drop=False, inplace=True) df2.set_index('PC', drop=False, inplace=True) # 3. 构造更新掩码:筛选df2中日期更大的行 update_mask = df2['Date'] > df1.loc[df2.index, 'Date'] df2_valid = df2[update_mask] # 4. 执行更新 df1.update(df2_valid) # (可选)如果需要把日期转回原字符串格式,添加以下代码 df1['Date'] = df1['Date'].dt.strftime('%-m/%-d/%Y')
方法2:使用filter_func参数的正确写法
你之前报错的原因是filter_func要求传入可调用对象(函数/ lambda等),而非直接传入布尔数组。这个可调用对象会接收df2的每一列作为输入,返回对应位置是否需要更新的布尔数组:
import pandas as pd # 1. 日期类型转换、设置索引步骤同上 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) df1.set_index('PC', drop=False, inplace=True) df2.set_index('PC', drop=False, inplace=True) # 2. 预计算每个索引是否满足更新条件 update_mask = df2['Date'] > df1.loc[df2.index, 'Date'] # 3. 定义符合要求的filter_func def update_filter(col): # 按当前列的索引返回对应的更新布尔值 return update_mask.reindex(col.index).values # 4. 带filter_func执行更新 df1.update(df2, filter_func=update_filter) # (可选)转回原日期字符串格式 df1['Date'] = df1['Date'].dt.strftime('%-m/%-d/%Y')
两种方法执行后得到的df1和你期望的输出结果完全一致。
内容的提问来源于stack exchange,提问作者rekeson21
相关产品推荐
相关产品推荐

