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

如何高效匹配两个DataFrame行,为df1关联符合条件的历史球员评分

高效匹配历史最新评分的解决方案

你之前的循环写法属于逐行全表筛选匹配,时间复杂度为O(n*m),面对十万/百万级数据自然性能极差。我们可以用pandas内置的merge_asof工具解决,这是专门为时间维度最近匹配场景设计的底层优化方法,时间复杂度仅为排序级的O(nlogn + mlogm),百万级数据秒级出结果。

实现步骤

1. 前置要求

两个表的date字段必须为可排序类型(整数年份、datetime格式均可),且需要提前按player_id和date升序排序,这是merge_asof的强制要求。

2. 核心代码

import pandas as pd

# 1. 排序预处理
df1_sorted = df1.sort_values(by=['player_id', 'date']).reset_index(drop=True)
df2_sorted = df2.sort_values(by=['player_id', 'date']).reset_index(drop=True)

# 2. 最近匹配
# allow_exact_matches=False表示只匹配df2日期严格小于df1日期的记录,direction='backward'表示取最近的历史记录
result = pd.merge_asof(
    left=df1_sorted,
    right=df2_sorted,
    by='player_id',
    on='date',
    direction='backward',
    allow_exact_matches=False
)

# 3. 恢复df1原始行顺序
result = result.set_index(df1.index).sort_index()

结果验证

用你提供的示例数据运行上述代码,最终result的player_rating列和预期输出完全一致:

dateplayer_idplayer_rating
2006150
2006265
2012385
2008255
2010160

注意事项

  • 如果pandas版本低于1.2.0没有allow_exact_matches参数,可以将df1的date字段做微小偏移后再匹配,比如整数年份的话用df1['date'] - 1e-6作为on字段即可实现严格小于的匹配逻辑
  • 如果存在df1的行在df2中没有符合条件的匹配记录,player_rating会返回NaN,可按需用fillna方法填充默认值

内容的提问来源于stack exchange,提问作者ahmad-reda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:57:02