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

如何在Pandas DataFrame中计算每个坐标对的最近邻欧氏距离(米)

解决方案

高效实现(推荐大数据集)

使用scikit-learn的NearestNeighbors结合Haversine球面距离公式,快速计算最近邻并转换为米:

import pandas as pd
import numpy as np
from sklearn.neighbors import NearestNeighbors

# 初始化示例DataFrame(替换为你的真实数据)
df = pd.DataFrame({
    'place id': [167312091448]*5,
    'var_lat_fact': [5.667982, 5.668632, 5.665353, 5.670097, 5.668981],
    'var_lon_fact': [-0.014495, -0.015791, -0.018198, -0.019140, -0.010404]
})

# 提取经纬度坐标,转换为弧度(Haversine要求弧度输入)
coords_rad = np.radians(df[['var_lat_fact', 'var_lon_fact']].values)

# 构建最近邻模型,找2个邻居(第一个是自身,第二个是最近邻)
nn_model = NearestNeighbors(n_neighbors=2, metric='haversine')
nn_model.fit(coords_rad)

# 获取距离(弧度单位)和对应索引
distances_rad, _ = nn_model.kneighbors(coords_rad)

# 将弧度距离转换为米(地球平均半径6371000米)
df['nearest_neighbour_dist'] = distances_rad[:, 1] * 6371000

# 保留6位小数匹配示例格式
df['nearest_neighbour_dist'] = df['nearest_neighbour_dist'].round(6)

print(df)

纯Pandas实现(适合小数据集)

如果不想引入额外库,手动实现Haversine公式遍历计算:

import pandas as pd
import numpy as np

def haversine_meters(lat1, lon1, lat2, lon2):
    """计算两点间的球面距离,返回米"""
    lat1, lon1, lat2, lon2 = map(np.radians, [lat1, lon1, lat2, lon2])
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
    c = 2 * np.arcsin(np.sqrt(a))
    return c * 6371000

# 初始化示例DataFrame
df = pd.DataFrame({
    'place id': [167312091448]*5,
    'var_lat_fact': [5.667982, 5.668632, 5.665353, 5.670097, 5.668981],
    'var_lon_fact': [-0.014495, -0.015791, -0.018198, -0.019140, -0.010404]
})

# 为每行计算最近邻距离(排除自身)
df['nearest_neighbour_dist'] = df.apply(
    lambda row: haversine_meters(row['var_lat_fact'], row['var_lon_fact'], 
                                 df['var_lat_fact'], df['var_lon_fact'])[
                                     df.index != row.name
                                 ].min(),
    axis=1
).round(6)

print(df)

关键说明

  • 为什么不用直接欧氏距离? 经纬度是球面坐标,直接计算度数的欧氏距离无法准确转换为米,Haversine公式是计算球面两点距离的标准方法,误差极小。
  • 地球半径取值:采用平均半径6371000米,若需更高精度可根据目标纬度调整,但小范围坐标下影响可以忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:34:50