2016-08-29 14 views
1

Ich habe eine CSV-Datei, die Stadt enthält, Breiten- und Längendaten in das unten stehenden Format:euklidische Entfernung Matrix unter Verwendung von Pandas

CITY|LATITUDE|LONGITUDE 
A|40.745392|-73.978364 
B|42.562786|-114.460503 
C|37.227928|-77.401924 
D|41.245708|-75.881241 
E|41.308273|-72.927887 

Ich brauche eine Distanzmatrix im folgende Format erstellen (ignorieren Sie den Dummy Werte):

  A   B   C   D   E 
A 0.000000 6.000000 5.744563 6.082763 5.656854 
B 6.000000 0.000000 6.082763 5.385165 5.477226 
C 1.744563 6.082763 0.000000 6.000000 5.385165 
D 6.082763 5.385165 6.000000 0.000000 5.385165 
E 5.656854 5.477226 5.385165 5.385165 0.000000 

I, die Daten in einem Datenrahmen pandas geladen haben und haben einen Quer verbinden, wie unten erstellt:

import pandas as pd 
df_A = pd.read_csv('lat_lon.csv', delimiter='|', encoding="utf-8-sig") 
df_B = df_A 
df_A['key'] = 1 
df_B['key'] = 1 
df_C = pd.merge(df_A, df_B, on='key') 
  • Können Sie mir bitte helfen, die obige Matrixstruktur zu erstellen?
  • Ist es auch möglich, Schritte zu vermeiden, die Cross-Join beinhalten?
+1

Haben Sie den Algorithmus haben den euklidischen Abstand zu berechnen? – StefanS

+0

Mögliches Duplikat von [Entfernungsmatrix für Zeilen im Pandas-Datenrahmen] (http://stackoverflow.com/questions/29723560/distance-matrix-for-rows-in-pandas-dataframe) – IanS

+0

@IanS, IMO, es ist nicht ganz dasselbe Frage (und die angegebene Antwort für die euklidische Distanz ist nicht die schnellste - wie sie die 'apply'-Methode verwendet) – MaxU

Antwort

2

Sie können pdist und squareform Methoden aus scipy.spatial.distance verwenden:

In [12]: df 
Out[12]: 
    CITY LATITUDE LONGITUDE 
0 A 40.745392 -73.978364 
1 B 42.562786 -114.460503 
2 C 37.227928 -77.401924 
3 D 41.245708 -75.881241 
4 E 41.308273 -72.927887 

In [13]: from scipy.spatial.distance import squareform, pdist 

In [14]: pd.DataFrame(squareform(pdist(df.iloc[:, 1:])), columns=df.CITY.unique(), index=df.CITY.unique()) 
Out[14]: 
      A   B   C   D   E 
A 0.000000 40.522913 4.908494 1.967551 1.191779 
B 40.522913 0.000000 37.440606 38.601738 41.551558 
C 4.908494 37.440606 0.000000 4.295932 6.055264 
D 1.967551 38.601738 4.295932 0.000000 2.954017 
E 1.191779 41.551558 6.055264 2.954017 0.000000 
+1

Ich habe nie 'pdist' verwendet, aber gemäß der Dokumentation verwendet es die 2d Euklidische Norm, die erfordert, dass Koordinaten auf einer Ebene liegen und Distanzeinheiten haben, von denen beide nicht für Längen- und Breitengrade gelten. – StefanS

+1

@StefanS, OP möchte'Euclidean Distance' haben - das ist ziemlich gut definiert und ist eine Standardmethode in 'pdist', wenn Sie oder OP eine andere Methode (minkowski, cityblock, seuklidean, sqeuklidean, cosine, correlation, hamming, jaccard, chebyshev, canberra, usw. - es gibt insgesamt 22 verschiedene Metriken) Sie können es einfach als "metric" Argument angeben – MaxU

+0

Nun, nur das OP kann wirklich wissen, was er will. Aber die euklidische Distanz ist gut definiert. Wenn Sie den Längen- und Breitengrad einer Kugel/eines Geoides haben, benötigen Sie zuerst die tatsächlichen Koordinaten in einem Längenmaß, ansonsten hängt Ihre "Entfernung" nicht nur vom relativen Abstand der Punkte ab, sondern auch von der absoluten Position auf der Kugel (zu den Polen wird der gleiche Winkel-Abstand weniger Länge-Abstand). In jedem Fall ist dieser Teil keine Programmierfrage. Sobald wir wissen, welchen Algorithmus das OP von lon/lat in 3D-Koordinaten übersetzen möchte, können wir seine Matrix aufbauen. – StefanS

0
for i in df["CITY"]: 
    for j in df["CITY"]: 
     row = df[df["CITY"] == j][["LATITUDE", "LONGITUDE"]] 
     latitude = row["LATITUDE"].tolist()[0] 
     longitude = row["LONGITUDE"].tolist()[0] 
     df.loc[df['CITY'] == i, j] = ((df["LATITUDE"] - latitude)**2 + (df["LONGITUDE"] - longitude)**2)**0.5 

df = df.drop(["CITY", "LATITUDE", "LONGITUDE"], axis=1) 

Das funktioniert

+0

Nein, dies berechnet die euklidische Norm der Längen- und Breitengrade (die in Grad Winkel sind). Das ist nicht die euklidische Distanz. – StefanS

+0

@StefanS Wie unterscheidet es sich hier in 2D? (Norm- und Distanzformeln) – Himaprasoon

Verwandte Themen