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

使用pandas merge_asof()遇排序报错,为何需单独重排create_at?

问题原因分析

核心规则:merge_asof()的排序验证逻辑

merge_asof()对输入数据的排序要求,完全取决于你是否指定了by参数:

  • 未指定by参数时:on参数指定的列(比如你的create_at)必须是全局有序的(默认要求升序,除非显式指定direction='descending')。
  • 指定by参数时:数据需要先按by列分组排序,再在每个分组内按on列排序,也就是整体要按[by列, on列]的顺序升序排列。

你的问题根源

你按['user_id', 'create_at']排序后仍报错,大概率是因为调用merge_asof()时没加by='user_id'参数:

  • 此时merge_asof()只会检查on='create_at'列是否全局有序,但先按user_id排序的操作会导致不同用户的时间戳交叉(比如用户A的某条记录时间是2023-01-05,用户B的某条记录时间是2023-01-03),整个表的create_at并非全局升序,触发了ValueError: left keys must be sorted。
  • 而单独按create_at排序后,该列全局有序,符合merge_asof()未指定by时的要求,所以报错消失。

正确用法示例

如果你的业务逻辑是按用户匹配最近的存款记录,正确的写法应该是:

# 按[user_id, create_at]升序排序
trades = trades.sort_values(['user_id', 'create_at'])
deposits = deposits.sort_values(['user_id', 'create_at'])
# 必须指定by参数,匹配merge_asof的排序逻辑
pd.merge_asof(trades, deposits, on='create_at', by='user_id')

这样既符合业务逻辑,也满足merge_asof()的排序要求,无需单独按create_at重排。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:07:20