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

Python实现Pandas DataFrame中坐标点的最近邻位置查找

嗨,我来帮你搞定这个问题!你之前的循环只记录了距离数值,没把对应的坐标位置存下来,其实只需要在计算的时候同时追踪每个距离对应的索引(或者你数据里的其他标识,比如地点名称)就行,下面给你具体的实现思路和代码示例:

解决方案

1. 先确认你的距离计算函数

不管你用的是球面距离(比如Haversine公式)还是平面距离,只要函数能接收两组经纬度并返回距离值就可以。这里我先给出一个常用的Haversine公式实现作为参考:

import math

def calculate_distance(lat1, lon1, lat2, lon2):
    # 计算两点间球面距离,单位:公里
    EARTH_RADIUS = 6371.0
    # 转换为弧度
    lat1_rad = math.radians(lat1)
    lon1_rad = math.radians(lon1)
    lat2_rad = math.radians(lat2)
    lon2_rad = math.radians(lon2)
    
    dlon = lon2_rad - lon1_rad
    dlat = lat2_rad - lat1_rad
    
    # Haversine公式核心计算
    a = math.sin(dlat / 2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2)**2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    
    return EARTH_RADIUS * c

2. 遍历追踪最小距离与对应位置

假设你的DataFrame名为df,包含latitude和longitude两列,我们可以新增列来存储每个坐标的最近距离和对应位置的索引:

import pandas as pd

# 初始化结果列
df['min_distance'] = float('inf')
df['closest_coords_index'] = -1

# 遍历每个坐标
for idx1, row1 in df.iterrows():
    lat1, lon1 = row1['latitude'], row1['longitude']
    # 遍历其余所有坐标
    for idx2, row2 in df.iterrows():
        # 跳过自身(避免距离为0的情况)
        if idx1 == idx2:
            continue
        lat2, lon2 = row2['latitude'], row2['longitude']
        current_dist = calculate_distance(lat1, lon1, lat2, lon2)
        # 更新当前坐标的最小距离及对应位置
        if current_dist < df.at[idx1, 'min_distance']:
            df.at[idx1, 'min_distance'] = current_dist
            df.at[idx1, 'closest_coords_index'] = idx2

# 可选:添加最近坐标的具体经纬度列,方便查看
df['closest_latitude'] = df['closest_coords_index'].apply(lambda x: df.at[x, 'latitude'] if x != -1 else None)
df['closest_longitude'] = df['closest_coords_index'].apply(lambda x: df.at[x, 'longitude'] if x != -1 else None)

3. 大数据量优化方案(可选)

如果你的坐标数量很多(比如超过1000条),双层for循环效率会很低,这时候可以用批量计算距离矩阵的方式优化,速度会快很多:

from scipy.spatial.distance import cdist
import numpy as np

# 将经纬度转换为弧度(适配Haversine公式)
coords = np.radians(df[['latitude', 'longitude']].values)
# 批量计算所有点之间的距离矩阵,转换为公里
distance_matrix = cdist(coords, coords, metric='haversine') * 6371.0
# 将对角线(自身到自身的距离)设为无穷大,避免被选中
np.fill_diagonal(distance_matrix, np.inf)

# 直接提取每个点的最小距离和对应索引
df['min_distance'] = distance_matrix.min(axis=1)
df['closest_coords_index'] = distance_matrix.argmin(axis=1)

# 补充最近坐标的经纬度
df['closest_latitude'] = df.loc[df['closest_coords_index'], 'latitude'].values
df['closest_longitude'] = df.loc[df['closest_coords_index'], 'longitude'].values

4. 验证结果

最后可以打印前几行数据,确认结果是否正确:

print(df[['latitude', 'longitude', 'min_distance', 'closest_latitude', 'closest_longitude']].head())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:05:48