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

如何在Pandas中查找两个DataFrame经纬度的最小距离配对

为df1每个位置匹配df2最近点的解决方案

方案1:基于现有代码快速修改

你已经生成了全量配对的new_df,只需要按门店分组后取距离最小的行即可:

# 按Store分组,取每组Distance最小的行
result = new_df.loc[new_df.groupby('Store')['Distance'].idxmin()]
print(result)

现有代码可优化点:

  • 嵌套循环+反复appendDataFrame性能极低,数据量超过千级会卡顿明显
  • 循环内每次打印new_df会浪费大量性能,建议将打印操作挪到循环外

方案2:更高效的无全量配对实现

不用生成所有配对数据,直接为df1的每一行匹配df2的最近点,性能提升非常明显:

import pandas as pd
from math import cos, asin, sqrt

def distance(lat1, lon1, lat2, lon2):
    p = 0.017453292519943295
    hav = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
    return 12742 * asin(sqrt(hav))

d1 = {'Address':['store_12', 'store_132', 'store_134', 'store_31' ,'store_23'], 'lat':[30.3757446, 33.3820989, 32.3746316, 34.2156779,33.1262516], 'lon':[-87.6797877,-111.964918, -111.1006705, -119.0655388, -117.3211879]}
d2 = {'loc':['geo123', 'geo134', 'geo154', 'geo112' ,'geo342','geo543'], 'lat':[59.5119, 66.9161, 65.37, 64.7408,62.9575,66.95], 'lon':[-139.6711,-151.5089, -146.59,-156.8756, -155.6103, -150.67]}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

# 用列表存储结果,比反复append DataFrame性能高数十倍
result_list = []

for _, row in df1.iterrows():
    store = row['Address']
    lat1, lon1 = row['lat'], row['lon']
    # 直接计算当前门店和所有df2点位的距离
    df2['dist'] = df2.apply(lambda x: distance(lat1, lon1, x['lat'], x['lon']), axis=1)
    # 取距离最小的行
    nearest = df2.loc[df2['dist'].idxmin()]
    result_list.append({
        'Store': store,
        'Location': nearest['loc'],
        'Distance': round(nearest['dist'], 2) # 保留两位小数,单位为公里
    })

# 最后一次性转为DataFrame
result = pd.DataFrame(result_list)
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:42:02