Daugiau

„Pandas DataFrame“ konvertavimas į „GeoDataFrame“

„Pandas DataFrame“ konvertavimas į „GeoDataFrame“


Tai atrodo pakankamai paprastas klausimas, bet aš negaliu suprasti, kaip „Pandas DataFrame“ paversti „GeoDataFrame“ erdviniam sujungimui?

Štai pavyzdys, kaip atrodo mano duomenys naudojantdf.head ():

Data/laikas Lat Lon ID 0 2014-04-01 0:11:00 40,77690 -73,9549 140 1 2014-04-01 0:17:00 40,7267 -74,0345 NaN

Tiesą sakant, šis duomenų rėmas buvo sukurtas iš CSV, taigi, jei lengviau skaityti CSV tiesiogiai kaip „GeoDataFrame“, tai taip pat gerai.


Konvertuokite „DataFrame“ turinį (pvz.LatirLonstulpelius) į atitinkamas „Shapely“ geometrijas, o tada naudokite jas kartu su originaliu „DataFrame“, kad sukurtumėte „GeoDataFrame“.

iš „Geopandas“ importo „GeoDataFrame“ iš formato.geometrijos importo Taško geometrija = [Taškas (xy) xy į ZIP (df.Lon, df.Lat)] df = df.drop (['Lon', 'Lat'], ašis = 1 ) gdf = GeoDataFrame (df, crs = "EPSG: 4326", geometrija = geometrija)

Rezultatas:

Data/laikas ID geometrija 0 2014-04-01 0:11:00 140 PUNKTAS (-73,95489999999999 40,776) 1 2014-04-01 0:17:00 NaN TAŠKAS (-74.03449999999999 40.7267)

Kadangi geometrijos dažnai pateikiamos WKT formatu, pagalvojau, kad taip pat pateiksiu pavyzdį šiuo atveju:

importuoti geopandas kaip gpd importuoti formuotą.wkt geometriją = df ['wktcolumn']. žemėlapį (shapely.wkt.loads) df = df.drop ('wktcolumn', axis = 1) gdf = gpd.GeoDataFrame (df, crs = " EPSG: 4326 ", geometrija = geometrija)

Atnaujinimas 201912: oficiali dokumentacija adresu https://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html tai glaustai naudojama geopandas.points_from_xy panašiai:

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

Taip pat galite nustatyti akarbaz(pvz., pakilimo) vertę, jei norite.


Senas metodas: naudojant formą

Vienos eilutės! Be to, keletas našumo rodiklių žmonėms, turintiems didelių duomenų.

Atsižvelgiant į apandas.DataFramekuris turi x ilgumą ir y platumą:

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

Paverskimepandas.DataFrameį ageopandas.GeoDataFrametaip:

Bibliotekos importavimas ir įspūdingas pagreitis:

importuoti geopandas kaip gpd importuoti formai formas

Kodas + lyginamasis laikas bandymų duomenų rinkinyje, kurį aš turiu:

#Pirminė Martino versija: #%laiko - 1,87 s ± 7,03 ms per kilpą (vidutinis ± standartinis dev. Iš 7 važiavimų, po 1 kilpą) gdf = gpd.GeoDataFrame (df.drop (['x', 'y'], ašis = 1), crs = {'init': 'epsg: 4326'}, geometrija = [shapely.geometry.Point (xy) xy in zip (df.x, df.y)]) #Pandos taikyti metodą # %laiko per 8,59 s ± 60,6 ms per kilpą (vidutinis ± standartinis 7 bėgimų skaičius, po 1 kilpą) gdf = gpd.GeoDataFrame (df.drop (['x', 'y'], ašis = 1), crs = {'init': 'epsg: 4326'}, geometry = df.apply (lambda eilutė: formingas.geometry.Point ((eilutė.x, eilutė.y)), ašis = 1))

Naudojantpandas.taikytiyra stebėtinai lėtesnis, tačiau gali būti geriau pritaikytas kai kurioms kitoms darbo eigoms (pvz., didesniems duomenų rinkiniams naudojant „Dask“ biblioteką):

Kreditai:

  • Sukurti formos failą iš „Pandas“ duomenų rėmo? (pandoms taikomas metodas)
  • Paspartinkite eilučių tašką daugiakampyje naudodami „Geopandas“ (norėdami pagreitinti užuominą)

Kai kurios nebaigtos gamybos nuorodos (nuo 2017 m.), Kaip tvarkyti dideliusbrūkšnysduomenų rinkiniai: