팬더 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으로 직접 읽는 것이 더 쉬운 경우에도 마찬가지입니다.


답변:


78

DataFrame의 내용 (예를 들어, 변환 LatLon적절한에 열을) 매끈한의 첫번째 형상 다음 GeoDataFrame을 만들기 위해 원래 DataFrame와 함께 사용합니다.

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)

다시 감사합니다! 그것은 훨씬 간단하고 매우 빠릅니다. 내 n = 500,000에서 df의 모든 행을 반복하는 것보다 훨씬 좋습니다 :)
atkat12

6
고마워요! 나는이 답변을 2 일마다 확인합니다 :)
Owen

1
이것이 문서의 첫 번째 항목이라고 생각할 것입니다!
Dominik

shapely.wkt에 +1 이것을 알아내는 데 시간이 걸렸습니다!
StefanK

14

원 라이너! 빅 데이터 사용자를위한 몇 가지 성능 지침.

주어진 pandas.DataFramex 경도와 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로 변환 해 봅시다 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은 놀랍게도 느리지 만 다른 워크 플로에 더 적합 할 수 있습니다 (예 : dask 라이브러리를 사용하는 더 큰 데이터 세트에서).

크레딧 :

dask데이터 세트 를 처리하기위한 일부 진행중인 참조 (2017 년 기준) :


비교해 주셔서 감사합니다. 실제로 zip 버전은 훨씬 빠릅니다.
MCMZL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.