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

Python中匹配双区间条件并为DataFrame添加对应列的实现方法

实现DataFrame区间匹配与值映射

首先,先确保我们导入pandas并准备好你提供的原始数据:

import pandas as pd

# 初始化data_1
val_1 = [81.322, 81.342, 81.452, 81.552, 82.522, 82.562, 82.722, 81.723, 81.322, 81.332 ]
val_2 = [0.234, 0.231, 0.333, 0.324, 0.666, 0.645, 0.334, 0.345, 0.878, 0.888]
data_1 = pd.DataFrame({'val_1': val_1, 'val_2': val_2})

# 初始化data_2
val_1_start = [81.100,81.41, 81.99, 81.320 ]
val_2_start = [0.230,0.331,0.32, 0.875 ]
val_1_end = [81.400,81.554,82.8, 81.333 ]
val_2_end = [0.281,0.335,0.68, 0.890]
value = [24,21,34,11]
data_2 = pd.DataFrame({'val_1_start': val_1_start, 'val_2_start': val_2_start, 'val_1_end': val_1_end, 'val_2_end':val_2_end, 'value': value})

形式一:保留所有记录,不匹配项填充NA

这个需求可以通过apply函数遍历data_1的每一行,检查是否落在data_2的某个区间内,匹配成功则返回对应的value,否则返回pd.NA:

def match_value(row):
    # 筛选data_2中满足双区间条件的行
    matched_rows = data_2[
        (data_2['val_1_start'] <= row['val_1']) & 
        (row['val_1'] <= data_2['val_1_end']) & 
        (data_2['val_2_start'] <= row['val_2']) & 
        (row['val_2'] <= data_2['val_2_end'])
    ]
    # 如果有匹配结果,返回第一个匹配的value;否则返回NA
    return matched_rows['value'].iloc[0] if not matched_rows.empty else pd.NA

# 给data_1添加value列
data_1['value'] = data_1.apply(match_value, axis=1)

# 输出结果
print(data_1)

运行后就会得到你想要的形式一结果,所有原始记录都保留,不满足条件的value列填充为NA。


形式二:只保留匹配成功的记录

如果只需要保留匹配上的记录,我们可以先做交叉连接,再筛选满足条件的行,最后去重(避免同一行匹配多个区间的情况):

# 交叉连接两个DataFrame(通过临时key实现)
cross_merged = data_1.assign(temp_key=1).merge(data_2.assign(temp_key=1), on='temp_key').drop('temp_key', axis=1)

# 筛选满足双区间条件的行
matched_data = cross_merged[
    (cross_merged['val_1_start'] <= cross_merged['val_1']) & 
    (cross_merged['val_1'] <= cross_merged['val_1_end']) & 
    (cross_merged['val_2_start'] <= cross_merged['val_2']) & 
    (cross_merged['val_2'] <= cross_merged['val_2_end'])
][['val_1', 'val_2', 'value']]

# 去重(如果你的数据不会出现一行匹配多个区间的情况,可以省略这步)
matched_data = matched_data.drop_duplicates(subset=['val_1', 'val_2'])

# 输出结果
print(matched_data)

这样得到的就是仅包含匹配成功记录的形式二结果。

小提示

如果data_2中存在重叠区间导致同一行data_1匹配多个value,你可以根据需求调整逻辑:比如取第一个匹配值、最后一个匹配值,或者对匹配的value求和/取均值等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:38:13