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

基于两个DataFrame经纬度计算distance特征的迭代问题求助

解决DataFrame经纬度距离计算的遍历问题

首先得指出你代码里的核心问题:你在遍历df1的时候,把df2的整列纬度和经度传给了haversine_distance函数,这会让函数返回一个数组(每个df1行对应所有df2行的距离),而df1['distance']需要的是单个值,直接赋值会导致数据结构不匹配,要么报错,要么得到嵌套的数组列,这肯定不是你想要的结果。

下面根据你的实际需求给出两种解决方案:

场景1:计算df1与df2对应行的距离(同索引匹配)

如果你的需求是df1的第1行对应df2的第1行,第2行对应第2行,这种一对一的距离计算,完全不需要遍历,利用numpy和pandas的向量化操作就能高效完成,速度比遍历快得多:

import numpy as np
import pandas as pd

# 你的haversine距离函数(保持不变)
def haversine_distance(lat1, lon1, lat2, lon2):
    r = 6371
    phi1 = np.radians(lat1)
    phi2 = np.radians(lat2)
    delta_phi = np.radians(lat2 - lat1)
    delta_lambda = np.radians(lon2 - lon1)
    a = np.sin(delta_phi / 2)**2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda / 2)**2
    res = r * (2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a)))
    return np.round(res, 2)

# 构造示例数据
df1 = pd.DataFrame({
    'longitude': [6.484708, 5.487838, 3.487838],
    'latitude': [43.506405, 43.559794, 43.218794],
    'distance': [np.nan, np.nan, np.nan]
})

df2 = pd.DataFrame({
    'longitude': [6.284471, 5.187238, 7.487858],
    'latitude': [43.506405, 43.545311, 43.561234]
})

# 直接向量化计算对应行的距离
df1['distance'] = haversine_distance(df1['latitude'], df1['longitude'], df2['latitude'], df2['longitude'])

print(df1)

运行后df1的distance列会得到每个对应行的距离值,比如第一行的结果是22.27(因为纬度相同,经度差对应的距离)。

场景2:计算df1每行与df2所有行的距离(取最近/最远/全部)

如果你的需求是计算df1的每一行到df2所有行的距离,然后比如保留最近的距离,那可以在遍历的时候对返回的距离数组做处理,比如取最小值:

distances_km = []
for row in df1.itertuples(index=False):
    # 计算当前行与df2所有行的距离,得到一个数组
    all_distances = haversine_distance(row.latitude, row.longitude, df2['latitude'], df2['longitude'])
    # 取最小距离(你也可以换成max()取最远,或者直接把all_distances存起来)
    distances_km.append(all_distances.min())

df1['distance'] = distances_km
print(df1)

这样df1的distance列会得到每行到df2所有点的最近距离,比如第三行的结果是444.73。

如果你想保留所有距离,可以把distances_km改成存储数组,然后df1['distance']会变成包含数组的列,后续可以根据需求展开或处理。


内容的提问来源于stack exchange,提问作者Med Nadhir afsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:20:34