Bir pandaları DataFrame'i bir GeoDataFrame'e dönüştürme


42

Bu, yeterince basit bir soru gibi gözüküyor, ancak bir panda DataFrame'in mekansal bir birleşme için GeoDataFrame'e nasıl dönüştürüleceğini çözemiyorum.

Verilerimin neye benzediğini gösteren örnek df.head():

    Date/Time           Lat       Lon       ID
0   4/1/2014 0:11:00    40.7690   -73.9549  140
1   4/1/2014 0:17:00    40.7267   -74.0345  NaN

Aslında, bu veri çerçevesi bir CSV'den yaratılmıştır, bu nedenle CSV'yi doğrudan bir GeoDataFrame olarak okumak daha kolaysa, bu da iyidir.


Yanıtlar:


78

DataFrame içeriğini (örneğin dönüştürme Latve Lonuygun içine sütunlar) Düzgün ilk geometrilere ve daha sonra bir GeoDataFrame yaratmak için orijinal DataFrame birlikte kullanabilirsiniz.

from geopandas import GeoDataFrame
from shapely.geometry import Point

geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
df = df.drop(['Lon', 'Lat'], axis=1)
crs = {'init': 'epsg:4326'}
gdf = GeoDataFrame(df, crs=crs, geometry=geometry)

Sonuç:

    Date/Time           ID      geometry
0   4/1/2014 0:11:00    140     POINT (-73.95489999999999 40.769)
1   4/1/2014 0:17:00    NaN     POINT (-74.03449999999999 40.7267)

Geometriler WKT formatında sık sık geldiğinden, bu durumda da bir örnek ekleyeceğimi düşündüm:

import geopandas as gpd
import shapely.wkt

geometry = df['wktcolumn'].map(shapely.wkt.loads)
df = df.drop('wktcolumn', axis=1)
crs = {'init': 'epsg:4326'}
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)

Tekrar teşekkürler! Bu çok daha basit ve çok hızlı çalışıyor
df'nin

6
Tanrım, teşekkürler! Her 2 günde bir bu cevabı kontrol ediyorum :)
Owen

1
Bunun belgelerdeki ilk giriş olacağını düşünürdüm!
Dominik

Shapely.wkt için +1. Bunu anlamak biraz zaman aldı!
StefanK

14

Tek gömlekleri! Ayrıca büyük veri insanları için bazı performans göstergeleri.

Buna pandas.DataFramegöre, bir x Boylam ve y Enlem gibi:

df.head()
x   y
0   229.617902  -73.133816
1   229.611157  -73.141299
2   229.609825  -73.142795
3   229.607159  -73.145782
4   229.605825  -73.147274

En dönüştürmek Let pandas.DataFramebir içine geopandas.GeoDataFrameaşağıdaki gibi:

Kütüphane içe aktarır ve düzgün şekilde hızlandırır :

import geopandas as gpd
import shapely
shapely.speedups.enable() # enabled by default from version 1.6.0

Bir test veri setinde kod + benchmark süreleri:

#Martin's original version:
#%timeit 1.87 s ± 7.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
gdf = gpd.GeoDataFrame(df.drop(['x', 'y'], axis=1),
                                crs={'init': 'epsg:4326'},
                                geometry=[shapely.geometry.Point(xy) for xy in zip(df.x, df.y)])



#Pandas apply method
#%timeit 8.59 s ± 60.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
gdf = gpd.GeoDataFrame(df.drop(['x', 'y'], axis=1),
                       crs={'init': 'epsg:4326'},
                       geometry=df.apply(lambda row: shapely.geometry.Point((row.x, row.y)), axis=1))

Kullanımı pandas.applyşaşırtıcı derecede yavaştır, ancak diğer bazı iş akışlarına daha uygun olabilir (örneğin, dask kitaplığını kullanan daha büyük veri kümelerinde):

Kredi için:

Büyük daskveri kümeleriyle ilgili bazı İlerlemeye Devam Eden referanslar (2017'den itibaren) :


Karşılaştırma için teşekkürler, gerçekten de zip sürümü çok daha hızlı
MCMZL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.