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

基于最后匹配值的Pandas Merge实现:按时间值合并两个DataFrame

解决两个DataFrame按最近后续时间匹配值的问题

要实现你需要的匹配逻辑——为DataFrame1的每个时间点找到DataFrame2中最近的后续时间点对应的Val值,我们可以借助pandas的searchsorted方法高效完成,下面是具体步骤和代码示例:

步骤说明

核心思路很直接:

  1. 先确保DataFrame2按时间列排序,这是后续精准查找的基础;
  2. 利用searchsorted定位DataFrame1每个时间点在DataFrame2时间序列中第一个大于等于它的位置;
  3. 根据定位的位置提取对应的Val值,合并到DataFrame1中。

完整代码示例

import pandas as pd

# 构造你的示例数据
df1 = pd.DataFrame({
    'Time': [3.00, 3.30, 4.00, 4.30, 5.00],
    'Grade': ['A', 'B', 'C', 'D', 'E']
})

df2 = pd.DataFrame({
    'Time': [3.30, 5.00],
    'Val': [1050, 2014]
})

# 1. 对DataFrame2按Time排序(即使原数据有序,这一步也能避免后续意外)
df2_sorted = df2.sort_values('Time').reset_index(drop=True)

# 2. 用searchsorted找到每个df1.Time对应的匹配位置
# side='left'表示找第一个大于等于当前时间的元素索引
match_indices = df2_sorted['Time'].searchsorted(df1['Time'], side='left')

# 3. 提取对应的Val值并合并到df1
df1['Val'] = df2_sorted.loc[match_indices, 'Val'].values

# 查看最终结果
print(df1)

运行后输出的结果完全符合你的期望:

Time Grade   Val
0   3.0     A  1050
1   3.3     B  1050
2   4.0     C  2014
3   4.3     D  2014
4   5.0     E  2014

额外注意事项

  • 如果DataFrame1中存在大于DataFrame2最大时间的时间点,searchsorted会返回等于df2长度的索引,直接取值会报错。可以提前用clip方法处理这种边界情况:
    # 把超出范围的索引强制替换为最后一个元素的索引
    match_indices = match_indices.clip(0, len(df2_sorted)-1)
    
  • 如果你习惯用merge_asof,也可以通过反转时间的方式实现(把时间取负数,将"找后续最近"转化为"找前面最近"),但searchsorted的方式更直观直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:58:13