একটি পান্ডাস ডেটা ফ্রেমকে জিওডাটাফ্রেমে রূপান্তর করুন


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

আসলে, এই ডেটাফ্রেমটি কোনও সিএসভি থেকে তৈরি করা হয়েছিল তাই যদি জিএসডিটা ফ্রেম হিসাবে সরাসরি সিএসভি পড়তে সহজ হয় তবে এটিও ঠিক আছে।


উত্তর:


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)

যেহেতু জ্যামিতিগুলি প্রায়শই ডব্লুকেটি ফর্ম্যাটে আসে তাই আমি ভেবেছিলাম যে আমি সেই মামলার জন্য একটি উদাহরণও অন্তর্ভুক্ত করব:

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)

আবার ধন্যবাদ! এটি অনেক সহজ এবং খুব দ্রুত চলে - আমার এন = 500,000 এ
ডিএফের

6
খোশ, ধন্যবাদ! আমি প্রতি 2 দিন মত :) এই উত্তরটি পরীক্ষা
ওয়েন

1
আপনি এই ডকুমেন্টেশনের প্রথম এন্ট্রি হবে মনে হয়!
ডোমিনিক

শেডলি.উইকটি জন্য +1 এটি বের করতে আমার কিছুটা সময় লেগেছিল!
স্টেফানক

14

এক-liners,! প্লাস বিগ-ডেটা লোকের জন্য কিছু পারফরম্যান্স পয়েন্টার।

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নিম্নরূপ:

লাইব্রেরি আমদানি এবং সুদৃ speed় গতিবেগ :

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ডেটাসেটগুলি পরিচালনা করার জন্য কিছু ওয়ার্ক-ইন-প্রগ্রেস রেফারেন্স (২০১ as হিসাবে) :


তুলনার জন্য ধন্যবাদ, প্রকৃতপক্ষে জিপ সংস্করণটি দ্রুততর
এমসিএমজেডএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.