Chuyển đổi DataFrame của gấu trúc thành GeoDataFrame


42

Đây có vẻ là một câu hỏi đủ đơn giản, nhưng tôi không thể tìm ra cách chuyển đổi DataFrame của gấu trúc thành GeoDataFrame để tham gia không gian.

Dưới đây là một ví dụ về dữ liệu của tôi trông như thế nào khi sử dụng 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

Trên thực tế, khung dữ liệu này được tạo từ CSV, vì vậy nếu đọc trực tiếp CSV dễ dàng hơn dưới dạng GeoDataFrame thì điều đó cũng tốt.


1
sử dụng GeoPandas
gen

Câu trả lời:


78

Chuyển đổi nội dung của DataFrame (ví dụ LatLoncác cột) thành hình học Shapely thích hợp trước rồi sau đó sử dụng chúng cùng với DataFrame gốc để tạo 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)

Kết quả:

    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)

Vì hình học thường có định dạng WKT, tôi nghĩ rằng tôi cũng bao gồm một ví dụ cho trường hợp đó:

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)

Cảm ơn một lần nữa! Điều đó đơn giản hơn nhiều và chạy rất nhanh - tốt hơn nhiều so với việc lặp qua từng hàng của df tại n = 500,000 của tôi :)
atkat12

6
Trời ạ, cảm ơn! Tôi kiểm tra câu trả lời này cứ sau 2 ngày :)
Owen

1
bạn nghĩ rằng đây sẽ là mục đầu tiên trong tài liệu!
Dominik

+1 cho shapely.wkt. Tôi phải mất một thời gian để tìm ra điều này!
StefanK

14

Một lớp lót! Cộng với một số gợi ý hiệu suất cho những người dữ liệu lớn.

Cho pandas.DataFramerằng có x Kinh độ và y Vĩ độ như vậ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

Hãy chuyển đổi pandas.DataFramethành geopandas.GeoDataFramenhư sau:

Nhập thư viện và tăng tốc tạo hình :

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

Mã + thời gian chuẩn trên một tập dữ liệu thử nghiệm tôi có nằm xung quanh:

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

Việc sử dụng pandas.applychậm hơn đáng ngạc nhiên, nhưng có thể phù hợp hơn với một số quy trình công việc khác (ví dụ: trên các bộ dữ liệu lớn hơn sử dụng thư viện dask):

Các khoản tín dụng để:

Một số tài liệu tham khảo Công việc đang tiến hành (tính đến năm 2017) để xử lý các daskbộ dữ liệu lớn :


Cảm ơn bạn đã so sánh, thực sự phiên bản zip nhanh hơn nhiều
MCMZL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.