Так что, если я вас правильно понимаю, у вас есть фрейм данных с долготой и широтой, и вы хотите рассчитать расстояние до долготы и широты, расположенное в следующей строке, и сохранить это значение как расстояние.
Фиктивный фрейм данных:
df = pd.DataFrame({'Long':[-2986.242495,-3383.296608,0,0],'Lat':[-880.627428,-2559.748913,0,0]})
df
Lat Long
-880.627428 -2986.242495
-2559.748913 -3383.296608
0.000000 0.000000
0.000000 0.000000
вместо выполнения цикла, в котором вы назначаете i + 1 для lat2 и long2, вы можете просто сдвинуть фрейм данных и сохранить значения в новых столбцах, как показано ниже
df[['Long_2','Lat_2']] = df[['Long','Lat']].shift(-1)
df
Lat Long Long_2 Lat_2
-880.627428 -2986.242495 -3383.296608 -2559.748913
-2559.748913 -3383.296608 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 NaN NaN
тогда мы можем создать столбцы расстояния, которые мы даем None как значение по умолчанию, и 0, где все столбцы равны 0
df['Distance'] = None
df.loc[(df.Lat==0) & (df.Long==0) & (df.Lat_2==0) & (df.Long_2==0),'Distance'] = 0
, где все столбцы не равны 0, мы используем нашу формулу расстояния для вычисления расстояния
df.loc[df.Distance!=0,'Distance'] = sphere_dist(df.loc[df.Distance!=0,'Lat'],df.loc[df.Distance!=0,'Long'],df.loc[df.Distance!=0,'Lat_2'],df.loc[df.Distance!=0,'Long_2'])
и теперь у нас есть датафрейм с результатом, который мы (будем надеяться) после, в столбцах расстояния
df
Lat Long Long_2 Lat_2 Distance
-880.627428 -2986.242495 -3383.296608 -2559.748913 12400
-2559.748913 -3383.296608 0.000000 0.000000 14239.1
0.000000 0.000000 0.000000 0.000000 0
0.000000 0.000000 NaN NaN NaN
Формула, которую я здесь использовал, это
def sphere_dist(pickup_lat, pickup_lon, dropoff_lat, dropoff_lon):
"""
Return distance along great radius between first and second coordinates.
"""
#Define earth radius (km)
R_earth = 6371
#Convert degrees to radians
pickup_lat, pickup_lon, dropoff_lat, dropoff_lon = map(np.radians,
[pickup_lat, pickup_lon,
dropoff_lat, dropoff_lon])
#Compute distances along lat, lon dimensions
dlat = dropoff_lat - pickup_lat
dlon = dropoff_lon - pickup_lon
#Compute haversine distance
a = np.sin(dlat/2.0)**2 + np.cos(pickup_lat) * np.cos(dropoff_lat) * np.sin(dlon/2.0)**2
return 2 * R_earth * np.arcsin(np.sqrt(a))