如何在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
相关产品推荐
相关产品推荐

