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

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'])

结果验证

任意方法执行后得到的结果均和你的预期完全一致:

datetimeStatus
2021-11-22 18:47:02AB_CL_NO
2021-01-08 14:18:11REP
2021-06-08 16:40:45AB_AUT
2021-12-03 10:21:31DROP
2021-12-03 15:21:31MLR_ST

注意:如果NewStatus表中存在同一个datetime对应多条不同New_Status的情况,必须先按业务规则去重,否则关联后会出现行数膨胀的问题,上述代码中的drop_duplicates就是为了规避这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:36:24