Перетворіть панди DataFrame в GeoDataFrame


42

Це здається досить простим питанням, але я не можу зрозуміти, як перетворити пандус DataFrame в GeoDataFrame для просторового з'єднання.

Ось приклад того, як виглядають мої дані 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

Насправді цей фрейм даних був створений з CSV, тому якщо його легше читати CSV безпосередньо як GeoDataFrame, це теж добре.


1
використовувати GeoPandas
ген

Відповіді:


78

Перетворити вміст DataFrame (наприклад Latі Lonстовпці) до відповідних струнких геометрії першим , а потім використовувати їх разом з оригінальним DataFrame створити GeoDataFrame.

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)

Результат:

    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)

Оскільки геометрії часто бувають у форматі WKT, я подумав, що я також включаю приклад для цього випадку:

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)

Знову дякую! Це набагато простіше і працює дуже швидко - набагато краще, ніж повторення через кожен ряд df в моєму n = 500 000 :)
atkat12

6
Боже, спасибі! Я перевіряю цю відповідь, як кожні 2 дні :)
Оуен

1
ви думаєте, що це буде перший запис у документації!
Домінік

+1 для стройного. Wkt. На це мені знадобився час, щоб зрозуміти це!
StefanK

14

Однолінійки! Плюс кілька покажчиків продуктивності для людей з великими даними.

Враховуючи, pandas.DataFrameщо має x Довготу та y Широту так:

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

Давайте перетворимо pandas.DataFrameв a geopandas.GeoDataFrameнаступним чином:

Бібліотечний імпорт та чіткі прискорення :

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

Код + еталонні рази на тестовому наборі даних:

#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))

Використання pandas.applyна диво повільніше, але може бути краще підходить для деяких інших робочих процесів (наприклад, для більших наборів даних за допомогою бібліотеки дакків):

Кредити:

Деякі посилання на незавершене виробництво (станом на 2017 рік) для обробки великих daskнаборів даних:


Дякую за порівняння, справді zip версія набагато швидша
MCMZL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.