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

如何在pandas DataFrame中查找与查询点最近的Top N个数据点

无标签场景下检索近邻样本的实现方案

针对无标签、不依赖复杂聚类、不需要传入目标变量的近邻检索需求,可通过两种轻量方案实现,完全避开“方法复杂度高、需要标签才能运行”的问题。

方案1:纯pandas/NumPy向量化计算(零额外依赖、逻辑完全透明)

核心逻辑:对DataFrame每一行与查询点的差值做平方和计算,按距离从小到大排序取前n个即可。因为平方和的排序顺序和直接开根号的欧氏距离完全一致,不需要额外开根号计算,可大幅降低算力消耗。

示例代码(匹配给出的样例场景)

import pandas as pd
# 构造提供的示例DataFrame
df = pd.DataFrame([
    [1,3,5,6],
    [2,7,9,1],
    [2,8,1,8],
    [5,4,9,0],
    [2,4,6,7]
])
# 定义查询点
query_point = [1,2,3,4]
# 计算每一行与查询点的平方欧氏距离
row_distances = ((df - query_point) ** 2).sum(axis=1)
# 取距离最小的前2行,输出结果与样例预期一致
top2_nearest = df.loc[row_distances.nsmallest(n=2).index]

方案特点:

  • 全程不需要传入任何标签/目标变量,和无标签场景完全适配
  • 逻辑完全可解释,不存在黑盒理解成本,远比聚类方法简单
  • 15维特征的场景下,哪怕DataFrame规模达到几十万行,向量化计算的速度也能满足日常使用需求

方案2:大规模数据下的高效检索(基于sklearn无监督近邻模块)

这里需要澄清一个常见误区:之前遇到的“KNN需要传入目标变量”,是因为使用了带预测功能的KNeighborsClassifier/KNeighborsRegressor类,这类模块的作用是基于近邻样本的标签做分类/回归预测,自然需要标签输入。如果只需要做近邻检索,直接用纯无监督的NearestNeighbors类即可,完全不需要任何标签。

示例代码:

from sklearn.neighbors import NearestNeighbors
# 初始化近邻检索器,指定取前2个近邻、用欧氏距离计算
nn_model = NearestNeighbors(n_neighbors=2, metric='euclidean')
# 拟合无标签DataFrame,全程不需要传任何标签列
nn_model.fit(df)
# 传入查询点(需转换为1行的二维结构),返回近邻的距离和对应的行索引
nearest_distances, nearest_indices = nn_model.kneighbors([query_point])
# 取出对应的原始行数据
top2_nearest = df.iloc[nearest_indices[0]]

方案特点:

  • 底层基于KD树/球树做结构优化,当DataFrame规模达到百万、千万行级别时,比纯pandas计算快几个数量级
  • 15维属于低维场景,KD树的检索效率会保持在很高的水平,不会出现高维下的性能退化问题

常见注意事项

  • 如果不同特征量纲差异很大(比如部分特征取值范围是01,另一部分是010000),计算距离前需要先对全量特征做标准化处理,否则量纲大的特征会完全主导距离计算结果,导致检索结果失真
  • 该需求本质是单点匹配检索,完全不需要对全量数据做聚类分组:聚类是对全量样本做结构划分的方法,流程复杂度高、结果不可控,对单点检索场景属于过度设计
  • 如果需要更换距离计算逻辑(比如曼哈顿距离、余弦距离),只需要调整计算时的聚合规则即可,不需要改动整体流程逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 21:36:03