Pandas如何按datetime列关联两DataFrame替换Status列值
解决方案
你可以选择以下任意一种方法实现匹配替换,所有方法都能得到你期望的结果:
方法1:补全你现有join逻辑的后续处理
你之前写的join关联逻辑本身没有问题,关联后只需要用新状态列填充原状态列的匹配值,清理多余列即可:
# 执行你原来的关联逻辑 merged_df = calls.reset_index().set_index('datetime').join( NewStatus.drop_duplicates().set_index('datetime'), how='left', rsuffix='df2' ) # 匹配到新状态的行替换原值,未匹配到的保留原有Status merged_df['Status'] = merged_df['New_Status'].fillna(merged_df['Status']) # 提取需要的字段还原表结构 final_calls = merged_df[['Status']].reset_index()
方法2:映射字典替换(代码最简洁)
不需要做表关联,直接把新状态表转成{datetime: New_Status}格式的映射字典,逐行替换即可,性能比join更好:
# 构造去重后的状态映射 status_mapping = NewStatus.drop_duplicates('datetime').set_index('datetime')['New_Status'].to_dict() # 逐行匹配替换,无匹配项保留原Status值 calls['Status'] = calls.apply( lambda row: status_mapping.get(row['datetime'], row['Status']), axis=1 )
执行完上述代码后,原calls表就已经是替换完成的结果,不需要额外做表结构调整。
方法3:merge+列合并(可读性最高)
用pandas标准左连接关联后,用combine_first方法完成列值合并:
# 按datetime字段左连接两个表 merged_df = calls.merge(NewStatus, on='datetime', how='left') # 优先取New_Status的值,为空时取原Status的值 merged_df['Status'] = merged_df['New_Status'].combine_first(merged_df['Status']) # 删除临时的New_Status列得到最终结果 final_calls = merged_df.drop(columns=['New_Status'])
结果验证
任意方法执行后得到的结果均和你的预期完全一致:
| datetime | Status |
|---|---|
| 2021-11-22 18:47:02 | AB_CL_NO |
| 2021-01-08 14:18:11 | REP |
| 2021-06-08 16:40:45 | AB_AUT |
| 2021-12-03 10:21:31 | DROP |
| 2021-12-03 15:21:31 | MLR_ST |
注意:如果NewStatus表中存在同一个datetime对应多条不同New_Status的情况,必须先按业务规则去重,否则关联后会出现行数膨胀的问题,上述代码中的
drop_duplicates就是为了规避这个问题。
内容的提问来源于stack exchange,提问作者wysouf
相关产品推荐
相关产品推荐

