Pandas Latitude-Longitude zum Abstand zwischen aufeinanderfolgenden Zeilen [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Schnelle Haversine-Approximation (Python / Pandas) 5 Antworten

In einem Pandas DataFrame in Python 2.7 ist Folgendes enthalten:

Ser_Numb        LAT      LONG
       1  74.166061 30.512811
       2  72.249672 33.427724
       3  67.499828 37.937264
       4  84.253715 69.328767
       5  72.104828 33.823462
       6  63.989462 51.918173
       7  80.209112 33.530778
       8  68.954132 35.981256
       9  83.378214 40.619652
       10 68.778571 6.607066

Ich möchte den Abstand zwischen aufeinanderfolgenden Zeilen im Datenrahmen berechnen. Die Ausgabe sollte ungefähr so aussehen:

Ser_Numb          LAT        LONG   Distance
       1    74.166061   30.512811          0
       2    72.249672   33.427724          d_between_Ser_Numb2 and Ser_Numb1
       3    67.499828   37.937264          d_between_Ser_Numb3 and Ser_Numb2
       4    84.253715   69.328767          d_between_Ser_Numb4 and Ser_Numb3
       5    72.104828   33.823462          d_between_Ser_Numb5 and Ser_Numb4
       6    63.989462   51.918173          d_between_Ser_Numb6 and Ser_Numb5
       7    80.209112   33.530778   .
       8    68.954132   35.981256   .
       9    83.378214   40.619652   .
       10   68.778571   6.607066    .

Versuc

Dieser Beitra sieht etwas ähnlich aus, berechnet aber den Abstand zwischen festen Punkten. Ich brauche den Abstand zwischen aufeinanderfolgenden Punkten.

Ich habe versucht, dies wie folgt anzupassen:

df['LAT_rad'], df['LON_rad'] = np.radians(df['LAT']), np.radians(df['LONG'])
df['dLON'] = df['LON_rad'] - np.radians(df['LON_rad'].shift(1))
df['dLAT'] = df['LAT_rad'] - np.radians(df['LAT_rad'].shift(1))
df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))

Ich erhalte jedoch den folgenden Fehler:

Traceback (most recent call last):
  File "C:\Python27\test.py", line 115, in <module>
    df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 78, in wrapper
    "{0}".format(str(converter)))
TypeError: cannot convert the series to <type 'float'>
[Finished in 2.3s with exit code 1]

Dieser Fehler wurde durch den Kommentar von MaxU behoben. Mit dem Fix ergibt die Ausgabe dieser Berechnung keinen Sinn - die Entfernung beträgt fast 8000 km:

   Ser_Numb        LAT       LONG   LAT_rad   LON_rad      dLON      dLAT     distance
0         1  74.166061  30.512811  1.294442  0.532549       NaN       NaN          NaN
1         2  72.249672  33.427724  1.260995  0.583424  0.574129  1.238402  8010.487211
2         3  67.499828  37.937264  1.178094  0.662130  0.651947  1.156086  7415.364469
3         4  84.253715  69.328767  1.470505  1.210015  1.198459  1.449943  9357.184623
4         5  72.104828  33.823462  1.258467  0.590331  0.569212  1.232802  7992.087820
5         6  63.989462  51.918173  1.116827  0.906143  0.895840  1.094862  7169.812123
6         7  80.209112  33.530778  1.399913  0.585222  0.569407  1.380421  8851.558260
7         8  68.954132  35.981256  1.203477  0.627991  0.617777  1.179044  7559.609520
8         9  83.378214  40.619652  1.455224  0.708947  0.697986  1.434220  9194.371978
9        10  68.778571   6.607066  1.200413  0.115315  0.102942  1.175014          NaN

Gemäß

DiesOnline-Rechne: Wenn ich Latitude1 = 74.166061, Longitude1 = 30.512811, Latitude2 = 72.249672, Longitude2 = 33.427724 verwende, erhalte ich 233 kmhaversine Funktion gefundenHie wie:print haversine(30.512811, 74.166061, 33.427724, 72.249672) dann bekomme ich 232,55 km

Die Antwort sollte 233 km sein, aber meine Annäherung gibt ~ 8000 km. Ich glaube, es stimmt etwas nicht, wenn ich versuche, zwischen aufeinanderfolgenden Zeilen zu wechseln.

Frage Gibt es eine Möglichkeit dies in Pandas zu tun? Oder muss ich den Datenrahmen zeilenweise durchlaufen?

Zusätzliche Information

Um den obigen DF zu erstellen, wählen Sie ihn aus und kopieren Sie ihn in die Zwischenablage. Dann

import pandas as pd
df = pd.read_clipboard()
print df

Antworten auf die Frage(2)

Ihre Antwort auf die Frage