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

Pandas调用含GeoPy的自定义函数计算前后行距离报错怎么解决?

问题

我需要对Pandas DataFrame每一行的当前值和上一行值应用如下自定义三维距离计算函数:

def eukarney(lat1, lon1, alt1, lat2, lon2, alt2):
    p1 = (lat1, lon1)
    p2 = (lat2, lon2)
    karney = distance.distance(p1, p2).m
    return np.sqrt(karney**2 + (alt2 - alt1)**2)

传入离散数值调用该函数可正常得到结果,示例如下:

distance = eukarney(49.907611, 5.890404, 339.15734, 49.907683, 5.890373, 339.18224)

但当我尝试直接传入DataFrame列及shift()生成的上一行值调用函数时:

df['distances'] = eukarney(df['latitude'], df['longitude'], df['altitude'], df['latitude'].shift(), df['longitude'].shift(), df['altitude'].shift())

运行抛出如下错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

相同语法在不使用geopy库的其他函数上可正常运行,请问是什么原因?该如何解决?

原因分析

该报错是因为GeoPy的distance函数本身仅支持标量数值输入,不支持直接传入Pandas序列(Series)作为参数。当直接传入整列数据时,函数内部的逻辑判断操作无法对序列直接生效,就会触发真值模糊的错误。

解决方案

可通过逐行apply的方式实现需求,参考代码如下:

# 生成上一行的偏移列,首行空值用当前行值填充保证计算逻辑正常
df['lat_shift'] = df['latitude'].shift().fillna(df['latitude'])
df['lon_shift'] = df['longitude'].shift().fillna(df['longitude'])
df['alt_shift'] = df['altitude'].shift().fillna(df['altitude'])

# 逐行调用自定义距离函数
df['distances'] = df.apply(lambda x: eukarney(x['latitude'], x['longitude'], x['altitude'], x['lat_shift'], x['lon_shift'], x['alt_shift']), axis=1).fillna(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:06:00