在具有两个纬度列和两个长列的 pandas 数据框中计算距离
Distance calculation in pandas dataframe with two lat columns and two long columns
我有一个包含这 4 列的 pandas Dataframe df :
- pickup_latitude
- pickup_longitude
- dropoff_latitude
- dropoff_longitude
我想创建一个新列,其中包含上车点和下车点之间的距离。
我创建了这个函数:
def calcul_de_distance_vol_oiseau(data):
R = 6373.0
""" je change les variables en radians car python parle en radian et pas en degrées """
data['pickup_longitude'] = data['pickup_longitude'].apply(radians)
data['pickup_latitude'] = data['pickup_latitude'].apply(radians)
data['dropoff_longitude'] = data['dropoff_longitude'].apply(radians)
data['dropoff_latitude'] = data['dropoff_latitude'].apply(radians)
data['diff_lon'] = data['dropoff_longitude'] - data['pickup_longitude']
data['diff_lat'] = data['dropoff_latitude'] - data['dropoff_latitude']
data['calcul_intermediaire']= (data['diff_lat'] / 2).apply(sin)**2 + data['pickup_latitude'].apply(cos) * data['dropoff_latitude'].apply(cos) * (data['diff_lon'] / 2).apply(sin)**2
data['distance'] = R*np.arctan2((data['calcul_intermediaire']).apply(sqrt),(1 - data['calcul_intermediaire']).apply(sqrt))
return data
但是当我想验证我的点之间的距离时,我没有得到与本网站相同的结果 https://www.sunearthtools.com/fr/tools/distance.php 计算 gps 点之间的距离。
我认为我的函数中存在数学错误,但我没有找到错误所在。
提前致谢
我想你只需要:
data['pickup_longitude'] = data['pickup_longitude'].apply(radians)
以及其他列的类似代码(使用 lambda 或定义函数)。
(迟到的答案,但是......)
我建议你使用 geopy.distance vincenty
, 定义一个函数来连接它 pandas
并使用此函数创建新的日期框列:
from geopy.distance import vincenty
def pandasVincenty(row):
'''calculate distance (m) between two lat&long points using the Vincenty formula '''
return vincenty((row.pickup_latitude, row.pickup_longitude), (row.dropoff_latitude, row.dropoff_longitude)).meters
data['distance'] = data.apply(lambda r: pandasVincenty(r), axis=1)
这使用度数作为输入并使用米作为输出...
这有效,您也可以使用 geopy.distance.distance():
>>def distance(row):
>>>return geopy.distance.distance((row.start_lats, row.start_longs),(row.end_lats, row.end_longs)).mi
>>new_df['miles_traveled']= new_df.apply(lambda r: distance(r), axis=1)
我有一个包含这 4 列的 pandas Dataframe df :
- pickup_latitude
- pickup_longitude
- dropoff_latitude
- dropoff_longitude
我想创建一个新列,其中包含上车点和下车点之间的距离。
我创建了这个函数:
def calcul_de_distance_vol_oiseau(data):
R = 6373.0
""" je change les variables en radians car python parle en radian et pas en degrées """
data['pickup_longitude'] = data['pickup_longitude'].apply(radians)
data['pickup_latitude'] = data['pickup_latitude'].apply(radians)
data['dropoff_longitude'] = data['dropoff_longitude'].apply(radians)
data['dropoff_latitude'] = data['dropoff_latitude'].apply(radians)
data['diff_lon'] = data['dropoff_longitude'] - data['pickup_longitude']
data['diff_lat'] = data['dropoff_latitude'] - data['dropoff_latitude']
data['calcul_intermediaire']= (data['diff_lat'] / 2).apply(sin)**2 + data['pickup_latitude'].apply(cos) * data['dropoff_latitude'].apply(cos) * (data['diff_lon'] / 2).apply(sin)**2
data['distance'] = R*np.arctan2((data['calcul_intermediaire']).apply(sqrt),(1 - data['calcul_intermediaire']).apply(sqrt))
return data
但是当我想验证我的点之间的距离时,我没有得到与本网站相同的结果 https://www.sunearthtools.com/fr/tools/distance.php 计算 gps 点之间的距离。 我认为我的函数中存在数学错误,但我没有找到错误所在。
提前致谢
我想你只需要:
data['pickup_longitude'] = data['pickup_longitude'].apply(radians)
以及其他列的类似代码(使用 lambda 或定义函数)。
(迟到的答案,但是......) 我建议你使用 geopy.distance vincenty , 定义一个函数来连接它 pandas 并使用此函数创建新的日期框列:
from geopy.distance import vincenty
def pandasVincenty(row):
'''calculate distance (m) between two lat&long points using the Vincenty formula '''
return vincenty((row.pickup_latitude, row.pickup_longitude), (row.dropoff_latitude, row.dropoff_longitude)).meters
data['distance'] = data.apply(lambda r: pandasVincenty(r), axis=1)
这使用度数作为输入并使用米作为输出...
这有效,您也可以使用 geopy.distance.distance():
>>def distance(row):
>>>return geopy.distance.distance((row.start_lats, row.start_longs),(row.end_lats, row.end_longs)).mi
>>new_df['miles_traveled']= new_df.apply(lambda r: distance(r), axis=1)