2017-12-26 6 views
0

Ich habe ein Geopandas-Datenframe aus einem Shapefile erstellt.Sortieren GeoPandas nach Name der Linie und nach geografischen Standort

Ich möchte meinen Dataframe nach der Spalte sortieren: "name" UND die Zeile Chunks sollten auch nach geographischem Standort sortiert werden, so dass alle in der Nähe befindlichen Chunks, die den gleichen Namen haben, zusammen gruppiert sind.

Wie kann ich diese Art von Sortierung durchführen?

Was ich versucht habe: 1. Ich berechne die mittlere fro jedes Linienzug koordinieren:

df['mean_coord'] = df.geometry.apply(lambda g: [np.mean(g.xy[0]),np.mean(g.xy[1])]) 
  1. I Gruppe der Datenrahmen gemäß der Spalte "Name" und ich sortieren die resultierende Datenrahmen nach der mittleren Koordinate:

    gruppiert = df.sort_values ​​([ 'mean_coord'], aufsteigend = false) .groupby ('name')

Aber ich bin mir nicht sicher, ob dies der beste/eleganteste oder sogar richtigste Weg ist. Ansonsten weiß ich nicht, wie ich aus dem gruppierten Element zu einem Pandas-Datenrahmen zurückkehren kann.

+0

Ich kann gar nicht genug betonen dieses genug: Sie müssen hart Code einige repräsentative Datensätze in Ihre Fragen, wie ich mit meiner Antwort habe hier: https://stackoverflow.com/a/47972529/1552748 –

+0

(und das bedeutet * nicht * das Verknüpfen mit irgendeinem zufälligen Shapefile) –

Antwort

1

Zuerst werde ich Ihnen zeigen, was ich hart codiert habe und angenommen, dass es sich um einen repräsentativen Datensatz handelt. Das ist wirklich etwas, was man in der Frage zur Verfügung gestellt haben sollte, aber ich fühle mich diese Ferienzeit großzügig:

from shapely.geometry import Point, LineString 
import geopandas 

line1 = LineString([ 
    Point(0, 0), 
    Point(0, 1), 
    Point(1, 1), 
    Point(1, 2), 
    Point(3, 3), 
    Point(5, 6), 
]) 

line2 = LineString([ 
    Point(5, 3), 
    Point(5, 5), 
    Point(9, 5), 
    Point(10, 7), 
    Point(11, 8), 
    Point(12, 12), 
]) 

line3 = LineString([ 
    Point(9, 10), 
    Point(10, 14), 
    Point(11, 12), 
    Point(12, 15), 
]) 

gdf = geopandas.GeoDataFrame(
    data={'name': ['A', 'B', 'A']}, 
    geometry=[line1, line2, line3] 
) 

So, jetzt werde ich die x- und y-Koordinaten der Schwerpunkte jeder Zeile berechnen , Durchschnitt sie, sortieren nach dem Durchschnitt und dem Namen der Zeile, entfernen Sie die Zwischenspalten.

output = (
    gdf.assign(x=lambda df: df['geometry'].centroid.x) 
     .assign(y=lambda df: df['geometry'].centroid.y) 
     .assign(rep_val=lambda df: df[['x', 'y']].mean(axis=1)) 
     .sort_values(by=['name', 'rep_val']) 
     .loc[:, gdf.columns] 
) 

print(output) 

    name          geometry 
0 A  LINESTRING (0 0, 0 1, 1 1, 1 2, 3 3, 5 6) 
2 A   LINESTRING (9 10, 10 14, 11 12, 12 15) 
1 B LINESTRING (5 3, 5 5, 9 5, 10 7, 11 8, 12 12) 
+0

vielen Dank! – james

Verwandte Themen