أكثر

تحويل Pandas DataFrame إلى GeoDataFrame

تحويل Pandas DataFrame إلى GeoDataFrame


يبدو هذا سؤالًا بسيطًا بدرجة كافية ، لكن لا يمكنني معرفة كيفية تحويل Pandas DataFrame إلى GeoDataFrame لضم مكاني؟

فيما يلي مثال لما تبدو عليه بياناتيdf.head ():

التاريخ / الوقت معرف خط خط الطول 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 فهذا جيد أيضًا.


قم بتحويل محتوى DataFrame (على سبيل المثاللاتولونأعمدة) في الأشكال الهندسية المناسبة أولاً ثم استخدمها مع DataFrame الأصلي لإنشاء GeoDataFrame.

من geopandas استيراد GeoDataFrame من shapely.geometry import Point geometry = [Point (xy) for xy in zip (df.Lon، df.Lat)] df = df.drop (['Lon'، 'Lat']، محور = 1 ) gdf = GeoDataFrame (df، crs = "EPSG: 4326" ، الهندسة = الهندسة)

نتيجة:

هندسة معرف التاريخ / الوقت 0 4/1/2014 0:11:00 140 نقطة (-73.95489999999999 40.769) 1 4/1/2014 0:17:00 NaN POINT (-74.03449999999999 40.7267)

نظرًا لأن الأشكال الهندسية غالبًا ما تأتي بتنسيق WKT ، فقد اعتقدت أنني سأقوم بتضمين مثال لهذه الحالة أيضًا:

استيراد الجيوباندا كـ gpd import shapely.wkt geometry = df ['wktcolumn']. map (shapely.wkt.loads) df = df.drop ('wktcolumn'، axis = 1) gdf = gpd.GeoDataFrame (df، crs = " EPSG: 4326 "، الهندسة = الهندسة)

تحديث 201912: الوثائق الرسمية على https://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html هل يتم ذلك بإيجاز باستخدام geopandas.points_from_xy مثل ذلك:

gdf = geopandas.GeoDataFrame (df، geometry = geopandas.points_from_xy (x = df.Longitude، y = df.Latitude))

يمكنك أيضًا تعيين ملفcrsأوض(مثل الارتفاع) القيمة إذا كنت تريد.


الطريقة القديمة: باستخدام رشيق

بطانة واحدة! بالإضافة إلى بعض مؤشرات الأداء للأشخاص ذوي البيانات الضخمة.

نظرا لالبانداالتي لديها x خط الطول و y Latitude مثل ذلك:

df.head () x y 0 229.617902 -73.133816 1 229.611157 -73.141299 22229.609825 -73.142795 3 229.607159 -73.145782 4229.605825 -73.147274

دعنا نحول ملفالبانداالىgeopandas.GeoDataFrameعلى النحو التالي:

واردات المكتبة والتسريع الجميل:

استيراد geopandas مثل استيراد gpd بشكل جميل .speedups.enable () # ممكّن افتراضيًا من الإصدار 1.6.0

أوقات التعليمات البرمجية + المعيارية في مجموعة بيانات الاختبار التي أجريتها:

# الإصدار الأصلي لمارتن: #٪ timeit 1.87 s ± 7.03 ms لكل حلقة (يعني ± std. dev. من 7 أشواط ، حلقة واحدة لكل منهما) gdf = gpd.GeoDataFrame (df.drop (['x'، 'y']، المحور = 1) ، crs = {'init': 'epsg: 4326'} ، الهندسة = [shapely.geometry.Point (xy) لـ xy في zip (df.x، df.y)]) # تطبيق Pandas الطريقة # النسبة المئوية للوقت 8.59 ثانية ± 60.6 مللي ثانية لكل حلقة (متوسط ​​± معدل تطور قدره 7 أشواط ، حلقة واحدة لكل حلقة) gdf = gpd.GeoDataFrame (df.drop (['x'، 'y']، محور = 1)، crs = {'init': 'epsg: 4326'}، الهندسة = df.apply (lambda row: shapely.geometry.Point ((row.x، row.y))، محور = 1))

استخدامالبانداأبطأ بشكل مدهش ، ولكنه قد يكون مناسبًا بشكل أفضل لبعض مهام سير العمل الأخرى (على سبيل المثال في مجموعات البيانات الأكبر باستخدام مكتبة dask):

الشكر ل:

  • جعل الشكل من Pandas dataframe؟ (لطريقة تطبيق الباندا)
  • تسريع نقطة الصف الحكيم في المضلع باستخدام Geopandas (لتلميح التسريع)

بعض مراجع العمل قيد التنفيذ (اعتبارًا من 2017) للتعامل مع المشكلات الكبيرةداسكمجموعات البيانات: