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

基于Pandas/PySpark获取与用户输入值最接近的两个数据点

Pandas 实现方案

针对你的需求,提供两种高效实现方式:

方式1:获取与目标值差值最小的任意两个点

直接计算每个数据点与目标值的绝对差,排序后取前两位,适用于不需要区分大小关系的场景:

import pandas as pd

# 示例数据
df = pd.DataFrame({'label': ['A', 'B', 'C', 'D', 'F'], 'value': [10, 3, 18, 7, 14]})
target = 4

# 计算绝对差值并排序取前2
df['diff'] = abs(df['value'] - target)
closest_points = df.sort_values('diff').head(2)
print(closest_points[['label', 'value']])

执行后会输出差值最小的两个点(对应你例子中的(B:3和D:7))。

方式2:获取目标值左右邻近的两个点(一个≤目标,一个≥目标)

如果需要分别找到小于等于目标的最大值和大于等于目标的最小值,用以下代码:

# 筛选小于等于目标的最大值
lower_point = df[df['value'] <= target].nlargest(1, 'value')
# 筛选大于等于目标的最小值
upper_point = df[df['value'] >= target].nsmallest(1, 'value')
# 合并结果
closest_pair = pd.concat([lower_point, upper_point])
print(closest_pair[['label', 'value']])

这种方式会精准匹配你例子中(B:3和D:7)的场景;如果目标值远大于所有数据,会返回最大的两个点(比如输入d=16时,会得到(C:18和F:14))。

PySpark 实现方案

如果数据量较大,用PySpark的分布式处理更高效,同样提供两种对应方案:

方式1:取差值最小的两个点

from pyspark.sql import SparkSession
from pyspark.sql.functions import abs, col

spark = SparkSession.builder.appName("closest_points").getOrCreate()

# 示例数据
data = [('A', 10), ('B', 3), ('C', 18), ('D', 7), ('F', 14)]
df = spark.createDataFrame(data, ['label', 'value'])
target = 4

# 计算差值并排序取前2
df_with_diff = df.withColumn('diff', abs(col('value') - target))
closest_points = df_with_diff.orderBy('diff').limit(2)
closest_points.select('label', 'value').show()

方式2:取目标值左右邻近的两个点

# 取小于等于目标的最大值
lower_point = df.filter(col('value') <= target).orderBy(col('value').desc()).limit(1)
# 取大于等于目标的最小值
upper_point = df.filter(col('value') >= target).orderBy(col('value').asc()).limit(1)
# 合并结果
closest_pair = lower_point.union(upper_point)
closest_pair.select('label', 'value').show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:45:42