4 votos

GeoPandas groupby está omitiendo columnas

Estoy utilizando esta respuesta para calcular algunas estadísticas básicas de algunos puntos que caen dentro de los límites de un polígono (una rejilla vectorial), tales que:

gridfile = 'grid.shp'
pointfile = 'points.shp'

point = gpd.GeoDataFrame.from_file(pointfile)

poly  = gpd.GeoDataFrame.from_file(gridfile)

pointInPolys = sjoin(point, poly, how='left')

grouped = pointInPolys.groupby('index_right')['X','Y','Z'].agg(['mean'])

grouped.columns = ["_".join(x) for x in grouped.columns.ravel()]

Los datos de los puntos de entrada tienen columnas X, Y y Z. Sin embargo, sólo devuelve las estadísticas (media) de X e Y y no devuelve las estadísticas de la columna Z:

            X_mean     Y_mean
index_right                      
1221        -64.781242  32.439396
1902        -64.781206  32.439096
2412        -64.781169  32.438777

Los datos están definitivamente disponibles en el paso anterior mediante comprobación:

pointInPolys.keys()

Index(['X', 'Y', 'Z', 'geometry', 'index_right', 'DN'], dtype='object')

¿Hay alguna razón por la que no se calculen las estadísticas de la columna Z?

4voto

rightkushagra Puntos 11

Debe haber algún dato no flotante en tu columna Z. Probablemente algún "NULL", "NAN" o "". Esto hace que el agregador "media" sea inútil.

He creado un gist con un ejemplo mínimo de trabajo (utilizando datos csv) de cómo geopandas funciona muy bien con nulos reales np.nan pero deja caer la columna si hay cadenas "NaN" en ella. Geopandas no aplicará el agg medio a las columnas de tipo no numérico (es decir: columnas de objetos). Véalo aquí: https://gist.github.com/jjclavijo/8b8b44fd944c9698a0c4f4a58637748b

Para solucionarlo, después de revisar tus datos, puedes convertirlos a float de forma segura, así todos los datos que no sean float se convertirán a np.nan.

grouped = pointInPolys.groupby('index_right')[['X','Y','Z']].agg(['mean'])
grouped

>>>
                X             Y
index_right     mean            mean    
0               -5.923750   -4.268750
1               32.738333   2.204000
2               32.669667   -5.528667

pointInPolys.loc[:,'Z'] = pointInPolys.Z.astype(float)
grouped = pointInPolys.groupby('index_right')[['X','Y','Z']].agg(['mean'])

   X            Y           Z
   mean          mean         mean          
0   -5.923750   -4.268750   609.49575
1   32.738333   2.204000    645.05100
2   32.669667   -5.528667   483.71250

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