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

Pandas计算连续行经纬度点间距离报错求助

问题分析与解决方案

错误原因

你遇到的TypeError是因为DataFrame使用了字符串类型的自定义索引(name列作为行索引),而df.loc[1:,'lat']试图用整数位置进行切片——loc是基于标签的索引器,不支持用整数位置来索引非整数标签的行,因此抛出类型错误。

另外还有一个隐藏问题:你调用haversine时设置了to_radians=False,但Haversine公式要求输入为弧度值,这个参数会导致计算结果完全错误,必须修正。

解决方案

方法1:改用iloc进行位置索引

iloc支持整数位置切片,直接替换loc即可:

df['dist'] = haversine(
    df['lat'].shift(), 
    df['long'].shift(),
    df['lat'].iloc[1:], 
    df['long'].iloc[1:]
    # 去掉to_radians=False,使用默认的弧度转换
)

方法2:重置为整数索引后使用原逻辑

如果可以临时替换索引,先把原索引转为列,用整数索引操作,之后可恢复原索引:

df = df.reset_index()
df['dist'] = haversine(
    df.lat.shift(), 
    df.long.shift(),
    df.loc[1:,'lat'], 
    df.loc[1:,'long']
)
# 恢复原索引
df = df.set_index('name')

完整可运行代码

import pandas as pd
import numpy as np

# 构造你的数据
data = {
    'lat': [11.463798, 44.405370, 14.928905, 68.951464, -1.678356],
    'long': [14.136215, -82.350737, -91.344523, -138.976699, 33.959323]
}
df = pd.DataFrame(data, index=['Veronica Session', 'Lynne Donahoo', 'Debbie Hanley', 'Lisandra Earls', 'Sybil Leef'])

def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
    if to_radians:
        lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
    a = np.sin((lat2-lat1)/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2
    return earth_radius * 2 * np.arcsin(np.sqrt(a))

# 计算连续点距离
df['dist'] = haversine(
    df['lat'].shift(), 
    df['long'].shift(),
    df['lat'].iloc[1:], 
    df['long'].iloc[1:]
)

print(df)

输出结果

lat        long         dist
Veronica Session  11.463798   14.136215          NaN
Lynne Donahoo     44.405370  -82.350737  9933.377344
Debbie Hanley     14.928905  -91.344523  3362.543744
Lisandra Earls    68.951464 -138.976699  6275.044648
Sybil Leef        -1.678356   33.959323  12155.151433

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:25:27