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

pandas get_loc最近日期匹配的向量化加速方案,解决百万行处理慢问题

高性能向量化实现方案

核心使用pandas内置的merge_asof方法,底层为C实现,完全避免逐行apply的Python层开销,百万行数据处理速度可以提升100倍以上。

前置操作要求

  • 两个DataFrame的日期列必须转换为datetime格式,不能是字符串
  • 两个DataFrame都必须按日期列升序排序
  • 若df1存在重复日期,需提前做去重/聚合处理,保证每个日期对应唯一的关联值

实现代码

import pandas as pd

# 1. 日期格式转换(如果还未转成datetime格式需先执行)
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'])

# 2. 按日期升序排序
df1 = df1.sort_values('date').reset_index(drop=True)
df2 = df2.sort_values('date').reset_index(drop=True)

# 3. 最近日期匹配映射
df2 = pd.merge_asof(
    df2,  # 左表,保留所有原始行
    df1[['date', 'rate']],  # 右表,仅取日期和需要映射的关联值列,示例列名为rate可根据实际修改
    on='date',  # 匹配的公共日期列,两表列名不同可分别用left_on/right_on指定
    direction='nearest',  # 匹配最接近的日期,可选'backward'/'forward'仅匹配前/后最近的日期
    # 可选增加时间范围限制:比如仅匹配7天内的日期,超出范围的映射值为NaN
    # tolerance=pd.Timedelta(days=7)
)

# 4. 重命名映射列名符合需求
df2 = df2.rename(columns={'rate': 'mapped_value'})

# 可选:如果需要保留df2原来的排序,可在排序前存储原始索引,映射完成后恢复
# df2['original_idx'] = df2.index
# 排序、merge操作执行完成后执行:
# df2 = df2.sort_values('original_idx').drop('original_idx', axis=1).reset_index(drop=True)

性能说明

原逐行apply方案的性能瓶颈在于Python层的逐行调用开销,即使get_loc本身是O(logN)的复杂度,百万行数据处理通常需要数分钟甚至更久。
merge_asof是纯向量化的底层实现,时间复杂度为O(N+M)(N为df2行数,M为df1行数),百万行数据处理通常可以在1秒内完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:03