【问题标题】:Python function to calculate distance using haversine formula in pandasPython函数在pandas中使用haversine公式计算距离
【发布时间】:2016-04-03 07:40:28
【问题描述】:

(IPython 笔记本) (公交统计)

summary.head()

我需要计算每两行之间的 distance_travelled,其中 1) row['sequence'] != 0,因为公交车在他的初始停靠站时没有距离 2) row['track_id'] == previous_row['track_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() 并应用 harvesine() 函数,如果行 'sequence' 参数不为 0 并且行的 'track_id' 等于前一行的 'track_id'

[编辑] 我认为没有必要检查行和上一行的 'track_id' 是否相同,因为 hasrsine() 函数仅应用于两行,并且当序列 = 0 时,该行的距离 = = 0,表示track_id发生了变化。因此,基本上,将 hasrsine() 函数应用于“序列”!= 0 的所有行,即 hasrsine(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,因为现在它只是一个占位符字符串,什么都不做。

【问题讨论】:

标签: python python-3.x pandas


【解决方案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_travelled'] = haversine(summary['lng'], summary['lat'], summary['lngp'], summary['latp']) 慢得多
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 2016-04-02
  • 2016-04-06
  • 2010-10-09
  • 2021-08-05
相关资源
最近更新 更多