แปลงแพนด้า 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

อันที่จริงแล้ว dataframe นี้ถูกสร้างขึ้นจาก 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
คุณคิดว่านี่เป็นรายการแรกในเอกสาร!
Dominik

+1 สำหรับ shapely.wkt ฉันใช้เวลาสักครู่เพื่อคิดออก!
StefanK

14

หนึ่งสมุทร! นอกจากนี้ยังมีตัวชี้ประสิทธิภาพสำหรับผู้ที่มีข้อมูลขนาดใหญ่

รับ a pandas.DataFrameที่มี x ลองจิจูดและ y Latitude ดังนี้:

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ช้าลงอย่างน่าประหลาดใจ แต่อาจเหมาะสำหรับเวิร์กโฟลว์อื่น ๆ (เช่นในชุดข้อมูลที่ใหญ่กว่าโดยใช้ไลบรารี dask):

เครดิตไปที่:

Work-In-Progress บางส่วนอ้างอิง (ณ 2017) สำหรับการจัดการdaskชุดข้อมูลขนาดใหญ่:


ขอบคุณสำหรับการเปรียบเทียบแน่นอนว่ารุ่นซิปนั้นเร็วกว่านี้
MCMZL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.