2016-08-16 10 views
0

Ich bin ziemlich neu in Python. Ich habe die folgende Tabelle in Postgres. Dies sind Polygon-Werte mit vier Koordinaten mit gleichen Id mit ZONE Namen ich gespeichert haben diese Daten in Python Datenrahmen df1 genanntFinde den nächsten Punkt in Pandas DataFrames

Id Order Lat    Lon   Zone 
00001 1 50.6373473 3.075029928   A 
00001 2 50.63740441 3.075068636   A 
00001 3 50.63744285 3.074951754   A 
00001 4 50.63737839 3.074913884   A 
00002 1 50.6376054 3.0750528   B 
00002 2 50.6375896 3.0751209   B 
00002 3 50.6374239 3.0750246   B 
00002 4 50.6374404 3.0749554   B 

ich Json Daten mit Lon und Lat Werte haben, und ich habe sie gespeichert ist Python Datenrahmen genannt df2.

Lat     Lon 
50.6375524099 3.07507914474 
50.6375714407 3.07508201591 

Meine Aufgabe ist es df2Lat und Lon Werte mit vier Koordinaten jeder Zone in df1 vergleichen die Zonennamen zu extrahieren und zu df2 hinzuzufügen.

Zum Beispiel (50.637552409 3.07507914474) gehört zu Zone B.

Derzeit habe ich es manuell für Zone 'A' getan. Ich muss die "Zonen" für die Koordinaten in df2 erzeugen.

+1

Es tut uns leid, SO ist keine Anleitung oder kostenlose Code schreiben Website. Bitte zeigen Sie zuerst Ihre Versuche. – Julien

Antwort

1

Das klingt nach einem guten Anwendungsfall für scipy cdist, auch diskutiert here.

import pandas as pd 
from scipy.spatial.distance import cdist 


data1 = {'Lat': pd.Series([50.6373473,50.63740441,50.63744285,50.63737839,50.6376054,50.6375896,50.6374239,50.6374404]), 
     'Lon': pd.Series([3.075029928,3.075068636,3.074951754,3.074913884,3.0750528,3.0751209,3.0750246,3.0749554]), 
     'Zone': pd.Series(['A','A','A','A','B','B','B','B'])} 

data2 = {'Lat': pd.Series([50.6375524099,50.6375714407]), 
     'Lon': pd.Series([3.07507914474,3.07508201591])} 


def closest_point(point, points): 
    """ Find closest point from a list of points. """ 
    return points[cdist([point], points).argmin()] 

def match_value(df, col1, x, col2): 
    """ Match value x from col1 row to value in col2. """ 
    return df[df[col1] == x][col2].values[0] 


df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 

df1['point'] = [(x, y) for x,y in zip(df1['Lat'], df1['Lon'])] 
df2['point'] = [(x, y) for x,y in zip(df2['Lat'], df2['Lon'])] 

df2['closest'] = [closest_point(x, list(df1['point'])) for x in df2['point']] 
df2['zone'] = [match_value(df1, 'point', x, 'Zone') for x in df2['closest']] 

print(df2) 
# Lat  Lon  point       closest     zone 
# 0 50.637552 3.075079 (50.6375524099, 3.07507914474) (50.6375896, 3.0751209) B 
# 1 50.637571 3.075082 (50.6375714407, 3.07508201591) (50.6375896, 3.0751209) B 
Verwandte Themen