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
相关产品推荐
相关产品推荐

