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

3
(IPython笔记本) (公交车统计数据)
summary.head() enter image description here 我需要计算每两行之间的distance_travelled,其中 1)row ['sequence']!= 0,因为当公交车在初始站点时没有距离 2)row ['track_id'] == previous_row ['track_id']。
我已经定义了haversine公式:
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()函数应用于所有'sequence'!= 0的行,即haversine(previous_row.lng,previous_row.lat,current_row.lng,current_row.lat)。尽管如此,仍需要帮助

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

summary['distance_travelled'] = summary.apply(lambda row: haversine(row['lng'], row['lat'], previous_row['lng'], previous_row['lat']), axis=1)

之前的代码中,previous_row只是一个占位符字符串,实际上应该是previous_row。


1
这不是一个重复的问题吗:https://dev59.com/w18e5IYBdhLWcg3wb52S#25767765? - EdChum
1个回答

2

如果我理解正确,您可以尝试以下方法:

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_travelled'] = haversine(summary['lng'], summary['lat'], summary['lngp'], summary['latp'])è¦پو…¢ه¾—ه¤ڑم€‚ - TomAugspurger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接