Résumer des sous-ensembles de données#
Supposons que nous voulions résumer nos données, par exemple en les divisant en groupes selon le nom de fichier et en calculant les mesures d’intensité moyenne pour ces groupes. Cela nous donnera un tableau plus petit avec des mesures résumées par fichier.
Voir aussi
import pandas as pd
import numpy as np
Pour démontrer l’exemple, nous chargeons un tableau qui contient des mesures de forme de nombreux objets qui ont été segmentés dans plusieurs fichiers de l’ensemble de données 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
Groupement par nom de fichier#
Nous allons maintenant grouper le tableau par nom de fichier image.
grouped_df = df.groupby('file_name')
grouped_df
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002DC95CF2520>
À partir de cet objet grouped_df, nous pouvons dériver des statistiques de base, par exemple la moyenne de toutes les colonnes numériques.
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 |
Le dataframe de sortie contient les valeurs moyennes de toutes les quantités, y compris les intensités que nous voulions. Notez que ce dataframe a ‘filename’ comme nom de l’index des lignes. Pour le convertir en un tableau normal avec une colonne d’index numérique, nous pouvons utiliser la méthode 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 |
Notez cependant que cela n’a pas été fait sur place. summary_df a toujours un index étiqueté round. Si vous voulez mettre à jour votre tableau, vous devez le faire explicitement avec un opérateur d’assignation.
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 |