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

如何实现基于区间匹配为Pandas DataFrame匹配对应Job值?

匹配区间关联Job值的解决方案

需求说明

根据df中的serial字段,匹配df2中StartSerial到StopSerial的区间,将对应区间的Job值关联到df中,无匹配区间的Job留空。

原始数据

import pandas as pd
import numpy as np

num = {'serial':[10,20,30,50]}
df = pd.DataFrame(num)
cols = {'StartSerial':[9,19,29,39],'StopSerial':[15,25,35,45],'Job':[564,859,748,125]}
df2 = pd.DataFrame(cols)

原代码问题分析

你之前的代码直接按索引位置对比df和df2的列,比如df['serial'][0]只和df2['StartSerial'][0]比较,但实际需求是每个serial要遍历df2所有区间找匹配,这种索引对齐的逻辑不符合区间匹配需求,因此报错。

解决方案

方法一:逐行匹配(直观易懂,适合小数据量)

def get_job(serial):
    # 筛选当前serial对应的区间
    match_mask = (df2['StartSerial'] <= serial) & (serial <= df2['StopSerial'])
    # 找到匹配的Job值,无匹配返回空字符串
    return df2.loc[match_mask, 'Job'].iloc[0] if match_mask.any() else ''

df['Job'] = df['serial'].apply(get_job)
print(df)

输出结果:

serial  Job
0      10  564
1      20  859
2      30  748
3      50     

方法二:交叉合并筛选(适合数据量中等场景)

先将两个表交叉合并得到所有组合,再筛选符合区间的记录,最后合并回原表:

# 交叉合并生成所有可能的serial-区间组合
cross_merged = df.merge(df2, how='cross')
# 筛选符合区间条件的记录
matched_records = cross_merged[(cross_merged['serial'] >= cross_merged['StartSerial']) & 
                               (cross_merged['serial'] <= cross_merged['StopSerial'])]
# 左连接回原表,空值填充为''
result = df.merge(matched_records[['serial', 'Job']], on='serial', how='left').fillna('')
print(result)

方法三:区间索引匹配(适合无重叠区间场景)

利用pd.IntervalIndex将区间转为索引,快速匹配:

# 生成闭合区间索引
interval_index = pd.IntervalIndex.from_arrays(df2['StartSerial'], df2['StopSerial'], closed='both')
# 用pd.cut匹配区间并关联Job标签,空值填充为''
df['Job'] = pd.cut(df['serial'], bins=interval_index, labels=df2['Job'], include_lowest=True).fillna('')
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:10