DataFrame中指定值的上下邻近值查找问题
如何在DataFrame中查找指定值的最近下界和上界
首先,你的问题核心是要找到小于等于目标值的最大值(最近下界)和大于等于目标值的最小值(最近上界),而不是单纯找两个距离最近的数——这也是你之前用df.iloc[(df[0]-value).abs().argsort()[:2]]失败的原因:这个方法会返回距离最近的两个数,但它们可能都在目标值的同一侧(比如都比目标值大或都小),无法满足你对上下界的要求。
下面是针对这个需求的具体解决方案:
核心实现步骤
假设你的DataFrame名为df,目标值为target:
获取最近下界(小于等于目标值的最大值)
# 筛选所有<=目标值的行,取第0列的最大值 lower_bound_value = df[df[0] <= target][0].max() # 拿到对应整行数据 lower_bound_row = df[df[0] == lower_bound_value]获取最近上界(大于等于目标值的最小值)
# 筛选所有>=目标值的行,取第0列的最小值 upper_bound_value = df[df[0] >= target][0].min() # 拿到对应整行数据 upper_bound_row = df[df[0] == upper_bound_value]特殊场景处理
- 如果目标值正好存在于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
相关产品推荐
相关产品推荐

