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

如何在pandas.merge_asof合并后保留两个连接键?

如何用pandas.merge_asof合并后保留两个连接键

嘿,我之前也碰到过这个问题!其实merge_asof默认只保留一组连接键的原因很直观:当你用on参数指定了左右表都有的同名列时,合并后会自动只保留一列(默认取左表的数值)。如果想要同时保留左右两个连接键,最靠谱的解法是先给其中一个表的连接键重命名,再通过left_on和right_on分别指定不同的列名来完成合并,这样两个连接键列就都会被保留下来了。

我给你举个实际的代码例子,一看就懂:

首先准备两个测试用的DataFrame:

import pandas as pd

# 左表
left_df = pd.DataFrame({
    'timestamp': [100, 300, 500],
    'data_left': ['A', 'B', 'C']
})

# 右表
right_df = pd.DataFrame({
    'timestamp': [200, 400, 600],
    'data_right': ['X', 'Y', 'Z']
})

如果直接用on='timestamp'合并,结果里只会有一列timestamp:

merged_default = pd.merge_asof(left_df, right_df, on='timestamp')
# 输出的merged_default只有timestamp、data_left、data_right三列

要保留两个连接键的话,先给右表的连接键重命名,比如改成timestamp_right:

right_df_renamed = right_df.rename(columns={'timestamp': 'timestamp_right'})

然后用left_on指定左表的连接键,right_on指定右表重命名后的连接键:

merged_with_both_keys = pd.merge_asof(
    left_df, 
    right_df_renamed, 
    left_on='timestamp', 
    right_on='timestamp_right'
)

现在看merged_with_both_keys,就会同时有timestamp(左表的连接键)和timestamp_right(右表的连接键)这两列啦!

另外还有一种变通方法:如果不想提前重命名,也可以在合并后手动把右表的连接键补回去,但这种方法依赖于合并后的行顺序和原右表的匹配关系(虽然merge_asof是按顺序匹配的,但不如重命名的方法稳妥)。比如:

merged_default = pd.merge_asof(left_df, right_df, on='timestamp')
merged_default['timestamp_right'] = right_df['timestamp'].iloc[merged_default.index]

不过还是更推荐第一种重命名+left_on/right_on的方法,逻辑更清晰,也不容易出错。

总结一下关键步骤:

  • 给其中一个DataFrame的连接键列重命名,避免和另一个表的连接键同名
  • 使用left_on参数指定左表的原连接键,right_on参数指定右表重命名后的连接键
  • 执行merge_asof,合并结果就会同时保留两个连接键列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:59:05