2 votos

¿Cómo poner esto en un bucle for? Estoy recreando la herramienta 'Tabular Área' de ArcMap en Python

Tengo dos shapefiles, una provincia con 39 municipios y una cobertura del terreno de la provincia.

Objetivo: obtener los metros cuadrados de cada clasificación de la cubierta del suelo para cada municipio. Por ejemplo, cuántos bosques abiertos, bosques cerrados, zonas erosionadas, etc. hay en Muni 1.

He conseguido escribir un código que lo hace, pero sólo para uno de los 39 municipios.

gdf1 = gpd.read_file('munis.shp')
gdf2 = gpd.read_file('landcover.shp')

muni1 = gdf1.loc[gdf1['NAME_2'] == 'muni1'] # NAME_2 is field containing all munis
intersection = gpd.overlay(muni1, gdf2, how='intersection')
area = intersection['geometry'].map(lambda p: p.area)
print(area)

El resultado son los metros cuadrados de cada clasificación de la cubierta terrestre en muni1 . ¿Cómo insertar esto en un bucle for para poder hacer el proceso por cada 39 municipios? Lo he intentado pero no funciona:

for i in range(gdf1.shape[0]):
    munis = gdf1.loc[gdf1['NAME_2'][i]]
    intersection = gpd.overlay(munis, gdf2, how='intersection')
    area = intersection['geometry'].map(lambda p: p.area)
    print(area)

Result
KeyError: 'Abad' # first municipality if sorted alphabetically

6voto

nitinsavant Puntos 6

loc principalmente basado en la "etiqueta del índice". Así, para la primera iteración gdf1['NAME_2'][0] devuelve muni1 . Entonces se produce un error al utilizar gdf1.loc['muni1'] porque Pandas interpreta 'muni1' ( 'Abad' ) como etiqueta de índice, pero su valor de NAME_2

Deberías cambiar munis = gdf1.loc[gdf1['NAME_2'][i]]
en gdf1.loc[gdf1['NAME_2'] == gdf1['NAME_2'][i]] en for bucle.

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