Introduction au travail avec les DataFrames#

En python de base, nous utilisons souvent des dictionnaires contenant nos mesures sous forme de vecteurs. Bien que ces structures de base soient pratiques pour collecter des données, elles sont sous-optimales pour un traitement ultérieur des données. Pour cela, nous introduisons les panda DataFrames qui sont plus pratiques pour les étapes suivantes. En Python, les scientifiques appellent souvent les tableaux “DataFrames”.

import pandas as pd

Création de DataFrames à partir d’un dictionnaire de listes#

Supposons que nous avons effectué un traitement d’image et que nous avons des résultats disponibles dans un dictionnaire contenant des listes de nombres :

measurements = {
    "labels":      [1, 2, 3],
    "area":       [45, 23, 68],
    "minor_axis": [2, 4, 4],
    "major_axis": [3, 4, 5],
}

Cette structure de données peut être joliment visualisée à l’aide d’un DataFrame :

df = pd.DataFrame(measurements)
df
labels area minor_axis major_axis
0 1 45 2 3
1 2 23 4 4
2 3 68 4 5

En utilisant ces DataFrames, la modification des données est simple. Par exemple, on peut ajouter une nouvelle colonne et calculer ses valeurs à partir des colonnes existantes :

df["aspect_ratio"] = df["major_axis"] / df["minor_axis"]
df
labels area minor_axis major_axis aspect_ratio
0 1 45 2 3 1.50
1 2 23 4 4 1.00
2 3 68 4 5 1.25

Sauvegarde des data frames#

Nous pouvons également sauvegarder ce tableau pour continuer à travailler avec.

df.to_csv("../../data/short_table.csv")

Chargement des data frames#

Les tableaux peuvent également être lus à partir de fichiers CSV.

df_csv = pd.read_csv('../../data/blobs_statistics.csv')
df_csv
Unnamed: 0 area mean_intensity minor_axis_length major_axis_length eccentricity extent feret_diameter_max equivalent_diameter_area bbox-0 bbox-1 bbox-2 bbox-3
0 0 422 192.379147 16.488550 34.566789 0.878900 0.586111 35.227830 23.179885 0 11 30 35
1 1 182 180.131868 11.736074 20.802697 0.825665 0.787879 21.377558 15.222667 0 53 11 74
2 2 661 205.216339 28.409502 30.208433 0.339934 0.874339 32.756679 29.010538 0 95 28 122
3 3 437 216.585812 23.143996 24.606130 0.339576 0.826087 26.925824 23.588253 0 144 23 167
4 4 476 212.302521 19.852882 31.075106 0.769317 0.863884 31.384710 24.618327 0 237 29 256
... ... ... ... ... ... ... ... ... ... ... ... ... ...
56 56 211 185.061611 14.522762 18.489138 0.618893 0.781481 18.973666 16.390654 232 39 250 54
57 57 78 185.230769 6.028638 17.579799 0.939361 0.722222 18.027756 9.965575 248 170 254 188
58 58 86 183.720930 5.426871 21.261427 0.966876 0.781818 22.000000 10.464158 249 117 254 139
59 59 51 190.431373 5.032414 13.742079 0.930534 0.728571 14.035669 8.058239 249 228 254 242
60 60 46 175.304348 3.803982 15.948714 0.971139 0.766667 15.033296 7.653040 250 67 254 82

61 rows × 13 columns

Généralement, nous n’avons pas besoin de toutes les informations dans ces tableaux et il est donc logique de réduire le tableau. Pour cela, nous affichons d’abord les noms des colonnes.

df_csv.keys()
Index(['Unnamed: 0', 'area', 'mean_intensity', 'minor_axis_length',
       'major_axis_length', 'eccentricity', 'extent', 'feret_diameter_max',
       'equivalent_diameter_area', 'bbox-0', 'bbox-1', 'bbox-2', 'bbox-3'],
      dtype='object')

Nous pouvons ensuite copier-coller les noms des colonnes qui nous intéressent et créer un nouveau data frame.

df_analysis = df_csv[['area', 'mean_intensity']]
df_analysis
area mean_intensity
0 422 192.379147
1 182 180.131868
2 661 205.216339
3 437 216.585812
4 476 212.302521
... ... ...
56 211 185.061611
57 78 185.230769
58 86 183.720930
59 51 190.431373
60 46 175.304348

61 rows × 2 columns

Vous pouvez ensuite accéder aux colonnes et ajouter de nouvelles colonnes.

df_analysis['total_intensity'] = df_analysis['area'] * df_analysis['mean_intensity']
df_analysis
C:\Users\haase\AppData\Local\Temp\ipykernel_3576\206920941.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_analysis['total_intensity'] = df_analysis['area'] * df_analysis['mean_intensity']
area mean_intensity total_intensity
0 422 192.379147 81184.0
1 182 180.131868 32784.0
2 661 205.216339 135648.0
3 437 216.585812 94648.0
4 476 212.302521 101056.0
... ... ... ...
56 211 185.061611 39048.0
57 78 185.230769 14448.0
58 86 183.720930 15800.0
59 51 190.431373 9712.0
60 46 175.304348 8064.0

61 rows × 3 columns

Exercice#

Pour le fichier CSV chargé, créez un tableau qui ne contient que ces colonnes :

  • minor_axis_length

  • major_axis_length

  • aspect_ratio

df_shape = pd.read_csv('../../data/blobs_statistics.csv')