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 |