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

使用pandas merge_asof报left keys must be sorted错误的解决方法

问题原因

报错ValueError: left keys must be sorted的核心原因是:使用pd.merge_asof并指定by='id'时,要求左DataFrame(df1)必须先按by列(id)排序,且每个id分组内的on列(datetime)是递增的,同时整个DataFrame的on列全局非递减。

你的df1按['id', 'datetime']排序后,id=2的datetime(2021-01-02)比id=1的datetime(2022-01-01)更早,导致全局datetime列出现了递减的情况,违反了merge_asof的要求。

解决方法

我们可以通过分组处理来规避这个问题:对df1按id分组,在每个分组内与df2中对应id的子数据集执行merge_asof,这样每个分组内的datetime都是递增的,满足merge_asof的要求。

修改后的代码如下:

import pandas as pd

df1 = pd.DataFrame({'id': [1, 1, 2, 3, 4], 'datetime': ['2022-01-01 01:00:00', '2022-01-01 02:00:00', '2021-01-02 01:00:00', '2022-01-03 01:00:00', '2022-01-04 01:00:00'], 'val1': [10, 20, 30, 40, 50]})

df2 = pd.DataFrame({'id': [1, 1, 2, 3, 4, 5],
                'datetime': ['2022-01-01 03:00:00', '2022-01-01 04:00:00', '2022-01-02 02:00:00', '2022-01-03 03:00:00', '2022-01-04 02:00:00', '2022-01-04 03:00:00'],
                'val2': [100, 200, 300, 400, 500, 600]})

# 转换datetime类型
df1['datetime'] = pd.to_datetime(df1['datetime'])
df2['datetime'] = pd.to_datetime(df2['datetime'])

# 对两个df按id和datetime排序(分组内排序用)
df1 = df1.sort_values(['id', 'datetime'])
df2 = df2.sort_values(['id', 'datetime'])

# 定义分组内合并函数
def merge_nearest(left_group, right_df):
    # 筛选右df中对应id的行
    right_group = right_df[right_df['id'] == left_group.name]
    # 分组内执行merge_asof
    return pd.merge_asof(left_group, right_group, on='datetime', direction='nearest')

# 按id分组合并
merged_df = df1.groupby('id', group_keys=False).apply(merge_nearest, right_df=df2)

print(merged_df)

运行结果:

id            datetime  val1  val2
0   1 2022-01-01 01:00:00    10   100
1   1 2022-01-01 02:00:00    20   100
2   2 2021-01-02 01:00:00    30   300
3   3 2022-01-03 01:00:00    40   400
4   4 2022-01-04 01:00:00    50   500
补充说明

如果你的pandas版本较新(>=1.5.0),也可以尝试调整排序逻辑,但分组处理是更通用的解决方案,不受不同id分组间datetime交叉的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:53:20