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

Pandas如何基于ID匹配与区间判断为DataFrame新增对应列

Pandas 按ID匹配数值区间关联字段实现

需求背景

两个DataFrame处理逻辑:

  • df1:长表结构,存储id标识、区间起止值Tin/Tout、对应区间名称name
  • df2:宽表结构,存储id标识、数值T、类型Type、指标值val
    需要为df2新增name列:先匹配两表id,再判断df2的T是否落在对应id下df1的[Tin, Tout)区间内,匹配到则取对应name,无匹配则填None。

高效实现代码

优先使用pandas内置的merge_asof实现,避免Python层循环,大数据量下性能远高于逐行apply:

import pandas as pd

# 初始化示例数据
df1 = pd.DataFrame(
      {'id': ['5AB', '5AB', '5AB', '5AB', '4CA', '01D', '01D', '4CA'],
       'Tin': [9.175, 0.792, 25.674999, 26.806999, 9.75, 7.51, 25.195, 21.316],
       'Tout': [20.792, 25.674999, 26.806999, 31.549, 21.316, 19.121, 28.669001, 26.337999],
       'name': ['FILIN', 'FILOUT', 'SEIN', 'SEOUT', 'FILIN', 'FIN', 'SEOUT', 'FILOUT']
      }) 

df2 = pd.DataFrame(
      {'id': ['01D', '01D', '4CA', '4CA', '5AB', '5AB'],
       'T': [12.3, 27.5, 22.64, 23.2, 11.52, 2.34],
       'Type': ['Temp', 'Pres', 'Prox', 'Prox', 'Pres', 'Axe'],
       'val': [11.3, 1, 0, 2, 0.5, 23.1]
    })

# 核心处理逻辑
# 按id、数值字段排序,满足merge_asof的有序要求
df1 = df1.sort_values(['id', 'Tin'])
df2 = df2.sort_values(['id', 'T'])

# 向后匹配:对每个T值,找到同id下Tin不大于T的最近区间
res = pd.merge_asof(
    df2,
    df1,
    left_on='T',
    right_on='Tin',
    by='id',
    direction='backward'
)

# 校验T值是否小于区间右边界Tout,不满足则说明无匹配区间
res['name'] = res.where(res['T'] < res['Tout'])['name']

# 整理输出字段
res = res[['id', 'T', 'Type', 'val', 'name']].reset_index(drop=True)

运行结果

输出res完全符合预期:

id      T  Type   val    name
0  01D  12.30  Temp  11.3     FIN
1  01D  27.50  Pres   1.0   SEOUT
2  4CA  22.64  Prox   0.0  FILOUT
3  4CA  23.20  Prox   2.0  FILOUT
4  5AB   2.34   Axe  23.1    None
5  5AB  11.52  Pres   0.5   FILIN

方案说明

  • 性能:merge_asof是pandas底层C实现的合并接口,十万级以上数据处理速度比逐行循环判断高1~2个数量级
  • 逻辑:direction='backward'保证只匹配左边界Tin小于等于当前T值的区间,再校验右边界即可确认区间归属,不会出现跨区间错配
  • 兼容性:如果存在区间重叠、无覆盖区间的场景,会自动将name赋值为缺失值,符合需求规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:18:17