एक पांडा DataFrame को GeoDataFrame में बदलें


42

यह एक साधारण पर्याप्त प्रश्न की तरह लगता है, लेकिन मैं यह नहीं जान सकता कि एक स्थानिक जुड़ाव के लिए एक डेटा डेटा फ़्रेम को जियोडाटाफ्रेम में कैसे परिवर्तित किया जाए।

यहाँ एक उदाहरण दिया गया है कि मेरा डेटा क्या उपयोग करता है 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 की सामग्री (जैसे Latऔर Lonकॉलम) को पहले उपयुक्त Shapely geometries में परिवर्तित करें और फिर 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)

चूंकि ज्यामितीय अक्सर डब्ल्यूकेटी प्रारूप में आते हैं, मैंने सोचा कि मैं उस मामले के लिए एक उदाहरण शामिल करूंगा:

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
आपको लगता है कि यह प्रलेखन में पहली प्रविष्टि होगी!
डोमिनिक

आकार देने के लिए +1। मुझे यह पता लगाने में थोड़ा समय लगा!
स्टेफनके

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एक में 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डेटासेट को संभालने के लिए कुछ कार्य-प्रगति के संदर्भ (2017 के अनुसार) :


तुलना के लिए धन्यवाद, वास्तव में जिप संस्करण तेज है
MCMZL
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.