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

如何高效实现两个Pandas DataFrame的坐标最近邻匹配?

高效坐标最近邻匹配方案

针对1万条坐标匹配200万条坐标的场景,迭代遍历完全不可取,推荐用基于空间索引的近邻查询方法,能把时间复杂度从O(n*m)降到O(n log m),效率提升几个数量级。以下是具体实现:

核心思路

用scikit-learn的NearestNeighbors构建KDTree空间索引,对df2的坐标建立索引后,批量查询df1每个坐标的最近邻,最后关联对应信息。如果是经纬度坐标,用haversine距离计算更符合地理空间的实际距离。

代码实现

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

# 示例数据(替换成你的真实DataFrame)
df1 = pd.DataFrame({
    'name': ['a'],
    'lat': [51.5068],
    'long': [-0.0733794]
})

df2 = pd.DataFrame({
    'lat': [51.078541, 55.056743],
    'long': [-0.066799, -2.127532],
    'value': [1000, 50]
})

# 1. 把经纬度转换成弧度(haversine距离要求输入为弧度)
df1_rad = np.radians(df1[['lat', 'long']])
df2_rad = np.radians(df2[['lat', 'long']])

# 2. 构建KDTree索引,指定haversine距离
nn = NearestNeighbors(n_neighbors=1, metric='haversine', n_jobs=-1)
nn.fit(df2_rad)

# 3. 查询每个df1坐标的最近邻索引
distances, indices = nn.kneighbors(df1_rad)

# 4. 把df2的关联信息匹配到df1
df1['value'] = df2.iloc[indices.flatten()]['value'].values

print(df1)

关键优化点

  • 多线程加速:n_jobs=-1会调用所有CPU核心并行计算,大幅缩短查询时间
  • 空间索引:KDTree把200万条坐标的查询复杂度从线性降到对数级,1万条数据的查询基本在几秒内完成
  • 距离精度:用haversine替代欧氏距离,避免经纬度直接计算欧氏距离的误差

备选方案(Geopandas)

如果已经在使用地理数据处理库geopandas,可以用sjoin_nearest方法,更简洁:

import geopandas as gpd
from shapely.geometry import Point

# 转换为GeoDataFrame
gdf1 = gpd.GeoDataFrame(df1, geometry=gpd.points_from_xy(df1['long'], df1['lat']))
gdf2 = gpd.GeoDataFrame(df2, geometry=gpd.points_from_xy(df2['long'], df2['lat']))

# 空间连接最近邻
result = gpd.sjoin_nearest(gdf1, gdf2, how='left')  # max_distance可选,用于过滤过远匹配
result = result.drop(columns=['index_right', 'geometry'])
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:10:27