Python计算无手机客户与有手机客户最小距离报错排查
问题分析与解决
错误原因
- 参数类型不匹配:调用
mydistanceCheck时传入的是整个DataFrame列(xs.lat_radians这类是pandas Series对象),但math模块的sin、cos等函数仅支持单个浮点数值,无法直接处理Series,这是触发TypeError的核心原因。 - 循环逻辑错误:内层
for循环的else块缩进错误,原本应该每次遍历ys的行时就对比距离并更新最小值,但你的代码仅在遍历完所有ys数据后才执行一次判断,逻辑完全失效。
修正后的代码
from math import sin, cos, sqrt, atan2 def mydistanceCheck(lat1, lat2, lon1, lon2): R = 6373.0 dlon = lon2 - lon1 dlat = lat2 - lat1 a = (sin(dlat/2))**2 + cos(lat1) * cos(lat2) * (sin(dlon/2))**2 c = 2 * atan2(sqrt(a), sqrt(1.0 - a)) distance = R * c return distance distarr = [] for n in xs.index: minDist = None point = None # 获取当前无手机客户的坐标 xs_lat = xs.loc[n, 'Latitude_Radians'] xs_lon = xs.loc[n, 'Long_Radians'] for p in ys.index: # 获取当前有手机客户的坐标 ys_lat = ys.loc[p, 'Latitude_Radians'] ys_lon = ys.loc[p, 'Long_Radians'] # 计算两点间距离 check = mydistanceCheck(xs_lat, ys_lat, xs_lon, ys_lon) # 更新最小距离及对应客户 if minDist is None or check < minDist: minDist = check point = p distarr.append({'min': minDist, 'to': point, 'from': n}) print(distarr)
大数据量场景优化建议
如果DataFrame数据量较大,嵌套循环效率极低,推荐用scipy库批量计算距离矩阵,快速定位最近邻:
from scipy.spatial.distance import cdist import numpy as np # 提取坐标矩阵 xs_coords = xs[['Latitude_Radians', 'Long_Radians']].values ys_coords = ys[['Latitude_Radians', 'Long_Radians']].values # 批量计算球面距离(转换为公里) distance_matrix = cdist(xs_coords, ys_coords, metric='haversine') * 6373.0 # 获取每个无手机客户的最近有手机客户索引和最小距离 min_indices = np.argmin(distance_matrix, axis=1) min_distances = np.min(distance_matrix, axis=1) # 组装结果 distarr = [ {'min': min_dist, 'to': ys.index[min_idx], 'from': xs.index[i]} for i, (min_dist, min_idx) in enumerate(zip(min_distances, min_indices)) ] print(distarr)
内容的提问来源于stack exchange,提问作者B F
相关产品推荐
相关产品推荐

