1 votos

Obteniendo el valor mediano del atributo para polígonos duplicados y eliminando duplicados usando GeoPandas

Tengo un DataFrame que resultó de unir espacialmente un mapa digital de elevación con un mapa de cuadrícula cuadrada.

introducir descripción de la imagen aquí

Esto resultó inesperadamente en filas duplicadas donde dos filas tendrán la misma "geometría" pero un valor de "Elevación" diferente.

¿Cómo obtengo la mediana de "Elevación" para cada "geometría" única? Soy nuevo en GeoPandas, así que intenté los métodos tradicionales para agregar un DataFrame, pero descubrí que "geometría" no se puede operar con la función groupby().

mrkna_grid.groupby("geometría")['Elevación'].mediana()

También he intentado usar la función dissolve(), pero no creo que lo esté haciendo correctamente porque el número de filas se redujo a solo setenta (70) en lugar de las dos mil (2000) originales antes de la unión espacial.

mrkna_grid.dissolve(by="Elevación", aggfunc="mediana")

1 votos

¿Deseas mantener las geometrías duplicadas?

0 votos

@BERA no, solo necesito cada "geometry" único y la mediana de todos sus "Elevation" asociados con dicho "geometry"

1voto

ARUNBALAN NV Puntos 101

Asumamos que hay una capa de polígonos 'capa' con su tabla de atributos, ver la imagen a continuación.

input

El resultado esperado de mediana es:

Polígono 1 | 4
Polígono 2 | 7
Polígono 3 | 15

Usando uno de los siguientes códigos:

La Solución #1 incluye el DataFrame.median() nativo de Pandas/GeoPandas

import geopandas as gpd

ruta_a_capa = "C:/Documentos/Scripts Python/mediana/capa.shp"
capa = gpd.read_file(ruta_a_capa)

capa_ = capa.groupby(capa["geometry"].to_wkt())['Elevación'].median().reset_index(name='ElevaciónMediana')
capa_['geometry'] = gpd.GeoSeries.from_wkt(capa_['index'])
capa_.drop(['index'], inplace=True, axis=1)

salida = gpd.GeoDataFrame(capa_, geometry='geometry')
salida = salida.set_crs(capa.crs)
salida.to_file("salida.shp")

La Solución #2 incluye el statistics.median() de Python

import geopandas as gpd
from statistics import median

ruta_a_capa = "C:/Documentos/Scripts Python/mediana/capa.shp"
capa = gpd.read_file(ruta_a_capa)

capa['geom_wkt'] = capa['geometry'].to_wkt()

capa_ = capa.groupby('geom_wkt')['Elevación'].apply(list).reset_index(name='ListaElevación')
capa_['mediana'] = capa_['ListaElevación'].apply(lambda x: median(x))
capa_['geometry'] = gpd.GeoSeries.from_wkt(capa_['geom_wkt'])
capa_.drop(['geom_wkt', 'ListaElevación'], inplace=True, axis=1)

salida = gpd.GeoDataFrame(capa_, geometry='geometry')
salida = salida.set_crs(capa.crs)
salida.to_file("salida.shp")

es posible lograr la siguiente salida:

result


Referencias:

0 votos

Gracias. Una pregunta, sin embargo: ¿el código anterior devuelve un dataframe que solo tiene "geometry" y "Elevation"? ¿Cómo se podrían retener hipotéticamente otros atributos?

0 votos

Probablemente haré la unión en por ejemplo, el atributo "geom_wkt". ¿Qué tipo de atributos te gustaría conservar? ¿Puedes compartir un fragmento de tus datos?

0 votos

La imagen completa del DataFrame en el OP tiene los atributos X, Y y Z (por brevedad) junto con los mostrados "geometry" y "Elevation".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X