基于两个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
相关产品推荐
相关产品推荐

