Resumiendo subconjuntos de datos#

Supongamos que queremos resumir nuestros datos, por ejemplo, dividiéndolos en grupos según el nombre del archivo y calculando mediciones de intensidad media para estos grupos. Esto nos dará una tabla más pequeña con mediciones resumidas por archivo.

Ver también

import pandas as pd
import numpy as np

Para demostrar el ejemplo, cargamos una tabla que contiene mediciones de forma de muchos objetos que han sido segmentados en múltiples archivos del conjunto de datos Broad Bioimage Benchmark Collection BBB0007 de Jones et al., Proc. ICCV Workshop on Computer Vision for Biomedical Image Applications, 2005).

df = pd.read_csv('../../data/BBBC007_analysis.csv')
df
area intensity_mean major_axis_length minor_axis_length aspect_ratio file_name
0 139 96.546763 17.504104 10.292770 1.700621 20P1_POS0010_D_1UL
1 360 86.613889 35.746808 14.983124 2.385805 20P1_POS0010_D_1UL
2 43 91.488372 12.967884 4.351573 2.980045 20P1_POS0010_D_1UL
3 140 73.742857 18.940508 10.314404 1.836316 20P1_POS0010_D_1UL
4 144 89.375000 13.639308 13.458532 1.013432 20P1_POS0010_D_1UL
... ... ... ... ... ... ...
106 305 88.252459 20.226532 19.244210 1.051045 20P1_POS0007_D_1UL
107 593 89.905565 36.508370 21.365394 1.708762 20P1_POS0007_D_1UL
108 289 106.851211 20.427809 18.221452 1.121086 20P1_POS0007_D_1UL
109 277 100.664260 20.307965 17.432920 1.164920 20P1_POS0007_D_1UL
110 46 70.869565 11.648895 5.298003 2.198733 20P1_POS0007_D_1UL

111 rows × 6 columns

Agrupando por nombre de archivo#

Ahora agruparemos la tabla por nombre de archivo de imagen.

grouped_df = df.groupby('file_name')
grouped_df
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002DC95CF2520>

De este objeto grouped_df podemos derivar estadísticas básicas, por ejemplo, la media de todas las columnas numéricas.

summary_df = grouped_df.mean(numeric_only = True)
summary_df
area intensity_mean major_axis_length minor_axis_length aspect_ratio
file_name
20P1_POS0007_D_1UL 300.859375 95.889956 22.015742 17.132505 1.316197
20P1_POS0010_D_1UL 253.361702 96.745373 20.120268 15.330923 1.402934

El dataframe resultante tiene los valores medios de todas las cantidades, incluyendo las intensidades que queríamos. Ten en cuenta que este dataframe tiene ‘filename’ como nombre del índice de fila. Para convertirlo de nuevo a una tabla normal con una columna de índice numérico, podemos usar el método reset_index().

summary_df.reset_index()
file_name area intensity_mean major_axis_length minor_axis_length aspect_ratio
0 20P1_POS0007_D_1UL 300.859375 95.889956 22.015742 17.132505 1.316197
1 20P1_POS0010_D_1UL 253.361702 96.745373 20.120268 15.330923 1.402934

Sin embargo, ten en cuenta que esto no se hizo en el lugar. summary_df todavía tiene un índice etiquetado como round. Si quieres actualizar tu tabla, tienes que hacerlo explícitamente con un operador de asignación.

summary_df = summary_df.reset_index()
summary_df
file_name area intensity_mean major_axis_length minor_axis_length aspect_ratio
0 20P1_POS0007_D_1UL 300.859375 95.889956 22.015742 17.132505 1.316197
1 20P1_POS0010_D_1UL 253.361702 96.745373 20.120268 15.330923 1.402934