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

如何基于坐标在DataFrame中找到最近的人?距离矩阵优化问题

解决方法

问题核心是距离矩阵dm的对角线元素(个体到自身的距离)为0,导致argmin和min直接选中自身。只需将对角线元素替换为无穷大,就能让算法跳过自身,寻找其他个体中的最近者。

修改后的代码如下:

import numpy as np
import pandas as pd
from scipy.spatial.distance import cdist
from haversine import haversine

# 读取数据
df = pd.read_csv('../data/file_name.csv')
df.set_index('Name', inplace=True)

# 生成距离矩阵
dm = cdist(df, df, metric=haversine)

# 将对角线(自身到自身的距离)设为无穷大,排除自身匹配
np.fill_diagonal(dm, np.inf)

# 找到每个个体对应的最近个体索引和距离
closest_indices = dm.argmin(axis=1)
min_distances = dm.min(axis=1)

# 将结果映射回原DataFrame
df['closest person'] = df.index[closest_indices]
df['distance'] = min_distances

# 查看结果
print(df)

关键说明

  • np.fill_diagonal(dm, np.inf):把距离矩阵中(i,i)位置的元素(即个体i到自身的距离)替换为无穷大,这样计算最小值时会自动跳过自身。
  • 注意haversine默认接受(纬度, 经度)格式,你的DataFrame列顺序正好是Latitude、Longitude,无需调整坐标顺序。

额外优化(可选)

如果数据集非常大,生成完整距离矩阵会占用过多内存,可以改用sklearn.neighbors.NearestNeighbors只计算每个点的最近邻,节省资源:

from sklearn.neighbors import NearestNeighbors

# 初始化近邻模型,找2个近邻(第一个是自身,取第二个)
nn = NearestNeighbors(n_neighbors=2, metric=haversine)
nn.fit(df)

# 计算距离和索引,取第二个结果作为最近的其他个体
distances, indices = nn.kneighbors(df)
df['closest person'] = df.index[indices[:,1]]
df['distance'] = distances[:,1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:18:19