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

Python计算无手机客户与有手机客户最小距离报错排查

问题分析与解决

错误原因

  1. 参数类型不匹配:调用mydistanceCheck时传入的是整个DataFrame列(xs.lat_radians这类是pandas Series对象),但math模块的sin、cos等函数仅支持单个浮点数值,无法直接处理Series,这是触发TypeError的核心原因。
  2. 循环逻辑错误:内层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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:42:53