基于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
相关产品推荐
相关产品推荐

