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

DataFrame中指定值的上下邻近值查找问题

如何在DataFrame中查找指定值的最近下界和上界

首先,你的问题核心是要找到小于等于目标值的最大值(最近下界)和大于等于目标值的最小值(最近上界),而不是单纯找两个距离最近的数——这也是你之前用df.iloc[(df[0]-value).abs().argsort()[:2]]失败的原因:这个方法会返回距离最近的两个数,但它们可能都在目标值的同一侧(比如都比目标值大或都小),无法满足你对上下界的要求。

下面是针对这个需求的具体解决方案:

核心实现步骤

假设你的DataFrame名为df,目标值为target:

  1. 获取最近下界(小于等于目标值的最大值)

    # 筛选所有<=目标值的行,取第0列的最大值
    lower_bound_value = df[df[0] <= target][0].max()
    # 拿到对应整行数据
    lower_bound_row = df[df[0] == lower_bound_value]
    
  2. 获取最近上界(大于等于目标值的最小值)

    # 筛选所有>=目标值的行,取第0列的最小值
    upper_bound_value = df[df[0] >= target][0].min()
    # 拿到对应整行数据
    upper_bound_row = df[df[0] == upper_bound_value]
    
  3. 特殊场景处理

    • 如果目标值正好存在于DataFrame中(比如你的例子中12.3),上下界的筛选会自动匹配到对应的前后值
    • 如果目标值大于所有数据,上界会返回NaN,可根据需求自定义处理(比如返回最大的数值作为上界)
    • 如果目标值小于所有数据,下界会返回NaN,同理处理

针对你示例的测试验证

比如查找target=15.9:

target = 15.9
lower_bound_value = df[df[0] <= target][0].max()  # 结果为 14.633333
upper_bound_value = df[df[0] >= target][0].min()  # 结果为 15.9(正好匹配到存在的值)

再比如查找target=12.3:

target = 12.3
lower_bound_value = df[df[0] <= target][0].max()  # 结果为 11.642857
upper_bound_value = df[df[0] >= target][0].min()  # 结果为 12.660000

完全符合你的预期要求。

进阶:封装成函数获取上下界行数据

如果你希望直接拿到上下界对应的整行数据,可以封装成一个函数:

import pandas as pd

def get_nearest_bounds(df, target):
    # 取最近下界的行
    lower_row = df[df[0] <= target].nlargest(1, 0)
    # 取最近上界的行
    upper_row = df[df[0] >= target].nsmallest(1, 0)
    # 合并结果返回
    return pd.concat([lower_row, upper_row])

# 使用示例
bounds_result = get_nearest_bounds(df, 12.3)
print(bounds_result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:47:41