Python函数在pandas中使用haversine公式计算距离

Python函数在pandas中使用haversine公式计算距离,python,python-3.x,pandas,Python,Python 3.x,Pandas,(IPython笔记本) (巴士统计) 摘要.总目() 我需要计算每两行之间的行驶距离,其中 1) 行['sequence']!=0,因为公共汽车在其初始站点时没有距离2)行['track\u id']==上一行['track\u id'] 我定义了哈弗森公式: def haversine(lon1, lat1, lon2, lat2): lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # have

(IPython笔记本) (巴士统计)

摘要.总目()

我需要计算每两行之间的行驶距离,其中 1) 行['sequence']!=0,因为公共汽车在其初始站点时没有距离2)行['track\u id']==上一行['track\u id']

我定义了哈弗森公式:

def haversine(lon1, lat1, lon2, lat2):

      lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

# haversine formula 
dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a)) 
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r
我不知道该怎么做。其中一个想法是使用itterrows()和apply harvesine()函数,如果行的“sequence”参数不是0,并且行的“track_id”等于前一行的“track_id”

[编辑]我认为不需要检查行和前一行的“track_id”是否相同,因为haversine()函数仅应用于两行,当sequence=0时,该行的距离==0,这意味着track_id已更改。因此,基本上,将haversine()函数应用于“序列”!=0,即haversine(上一行.lng,上一行.lat,当前行.lng,当前行.lat)。还是需要帮助

[编辑2] 我通过以下方式实现了类似的目标:

summary['distance_travelled'] = summary.apply(lambda row: haversine(row['lng'], row['lat'], previous_row['lng'], previous_row['lat']), axis=1)
其中上一行实际上应该是上一行,因为现在它只是一个占位符字符串,不起任何作用。

IIUC您可以尝试:

print summary

  track_id  sequence        lat        lng  distance_travelled
0      1-1         0  41.041870  29.060010                   0
4      1-1         1  41.040859  29.059980                   0
6      1-1         2  41.039242  29.059731                   0
#create new shifted columns  
summary['latp'] = summary['lat'].shift(1)
summary['lngp'] = summary['lng'].shift(1)
print summary

  track_id  sequence        lat        lng  distance_travelled       latp  \
0      1-1         0  41.041870  29.060010                   0        NaN   
4      1-1         1  41.040859  29.059980                   0  41.041870   
6      1-1         2  41.039242  29.059731                   0  41.040859   

       lngp  
0       NaN  
4  29.06001  
6  29.05998  
summary['distance_travelled'] = summary.apply(lambda row: haversine(row['lng'], row['lat'], row['lngp'], row['latp']), axis=1)
#remove column lngp, latp
summary = summary.drop(['lngp','latp'], axis=1)
print summary

  track_id  sequence        lat        lng  distance_travelled
0      1-1         0  41.041870  29.060010                 NaN
4      1-1         1  41.040859  29.059980            0.112446
6      1-1         2  41.039242  29.059731            0.181011

如果性能很重要,那么调用
.apply(haversine,axis=1)
将比编写
haversine
获取numpy数组并执行
summary['distance_traveled']=haversine(summary['lng'],summary['lat'],summary['lngp'],summary['latp'])要慢得多。
这不是一个重复吗?