pandas
Département de Mathématiques et Informatique, Faculté des Sciences et Techniques, Université Cheikh Anta Diop de Dakar
Contenu
NumPy calcule sur des tableaux de nombres. pandas, bâti sur NumPy, ajoute des colonnes nommées et des lignes étiquetées : le DataFrame, la table de données de la bio-informatique. On manipule notre jeu de morphométrie de pinsons, cette fois avec une colonne espece.
read_csv).shape, info, describe.L’entraînement se fait dans le notebook, avec une cellule « À vous » après chaque notion.
Un DataFrame : des colonnes nommées et un index. On sélectionne une colonne (une Series), on filtre des lignes ; une case manquante vaut NaN.
L’idée en une phrase
Une Series est une colonne : des valeurs avec une étiquette (l’index). Un DataFrame réunit plusieurs colonnes partageant le même index — une table. On importe pandas sous le nom pd ; tout est bâti sur NumPy.
Résultat →
fuliginosa 15.2
fortis 21.5
magnirostris 28.0
dtype: float64
Chaque valeur porte une étiquette (le nom d’espèce) plutôt qu’un simple numéro de position.
L’idée en une phrase
On construit un DataFrame à partir d’un dictionnaire (chaque clé devient une colonne) ; mais en pratique, les données arrivent dans un fichier CSV que l’on charge avec read_csv.
Résultat →
espece bec_long bec_haut aile masse
0 fuliginosa 9.1 8.0 67.0 15
1 fuliginosa 9.4 8.3 68.0 16
2 fuliginosa 8.9 7.8 66.0 14
3 fuliginosa 9.6 8.5 69.0 16
4 fuliginosa 9.2 8.1 67.0 15
head() montre les premières lignes. La table compte 15 spécimens.
Résultat →
espece bec_long bec_haut aile masse
0 fuliginosa 9.1 8.0 67.0 15
1 fuliginosa 9.4 8.3 68.0 16
2 fuliginosa 8.9 7.8 66.0 14
3 fuliginosa 9.6 8.5 69.0 16
4 fuliginosa 9.2 8.1 67.0 15
read_csv est le point de départ de presque toute analyse de données réelle.
Résultat →
(15, 5)
bec_long bec_haut aile masse
count 15.00 15.00 14.00 15.00
mean 12.55 10.75 73.64 21.13
std 2.75 2.41 5.36 5.18
min 8.90 7.80 66.00 14.00
25% 9.50 8.40 68.25 16.00
50% 12.90 10.60 74.50 21.00
75% 14.60 12.45 78.25 25.00
max 16.50 14.60 81.00 29.00
describe résume chaque mesure. aile n’a que 14 valeurs (count) : une manque.
info()Résultat →
<class 'pandas.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 espece 15 non-null str
1 bec_long 15 non-null float64
2 bec_haut 15 non-null float64
3 aile 14 non-null float64
4 masse 15 non-null int64
dtypes: float64(3), int64(1), str(1)
info() donne le type de chaque colonne et son nombre de valeurs présentes : aile affiche 14, la mesure manquante s’y voit aussi.
L’idée en une phrase
Une colonne se prend par son nom : df["masse"] (une Series). Plusieurs colonnes : une liste de noms, df[["espece", "masse"]]. Une ligne se prend par son étiquette avec loc.
Résultat →
espece masse
0 fuliginosa 15
1 fuliginosa 16
2 fuliginosa 14
3 fuliginosa 16
4 fuliginosa 15
Crochets simples pour une colonne (Series) ; crochets doubles (une liste de noms) pour plusieurs colonnes (un DataFrame).
locRésultat →
espece fuliginosa
bec_long 9.1
bec_haut 8.0
aile 67.0
masse 15
Name: 0, dtype: object
fuliginosa
df.loc[0] donne la ligne d’étiquette 0 (comme une Series) ; df.loc[0, "espece"] vise une case précise.
Comme avec NumPy
Une comparaison produit un masque ; entre crochets, il ne garde que les lignes qui vérifient la condition.
Résultat →
espece bec_long bec_haut aile masse
11 magnirostris 16.1 14.2 80.0 28
12 magnirostris 15.7 13.8 79.0 27
13 magnirostris 16.5 14.6 81.0 29
14 magnirostris 15.9 14.0 80.0 28
Tous les spécimens de plus de 25 g sont des magnirostris : le filtre a isolé la plus grande espèce.
Résultat →
espece bec_long bec_haut rapport_bec
0 fuliginosa 9.1 8.0 1.14
1 fuliginosa 9.4 8.3 1.13
2 fuliginosa 8.9 7.8 1.14
3 fuliginosa 9.6 8.5 1.13
4 fuliginosa 9.2 8.1 1.14
Le calcul est vectorisé, comme avec NumPy : la nouvelle colonne s’obtient à partir des colonnes existantes.
Résultat →
espece bec_long bec_haut aile masse rapport_bec
2 fuliginosa 8.9 7.8 66.0 14 1.14
0 fuliginosa 9.1 8.0 67.0 15 1.14
4 fuliginosa 9.2 8.1 67.0 15 1.14
1 fuliginosa 9.4 8.3 68.0 16 1.13
3 fuliginosa 9.6 8.5 69.0 16 1.13
sort_values("masse") réordonne du plus léger au plus lourd : les plus petits spécimens sont des fuliginosa.
L’idée en une phrase
Une mesure absente vaut NaN. isna() la repère, .sum() la compte ; on peut supprimer les lignes (dropna) ou combler le trou (fillna).
Résultat →
espece bec_long bec_haut aile masse rapport_bec
7 fortis 12.5 10.2 NaN 20 1.23
0
L’idée en une phrase
value_counts() compte les occurrences de chaque valeur d’une colonne. groupby("espece") rassemble les lignes par espèce ; on applique ensuite une agrégation (mean, sum…) à chaque groupe. C’est le cœur de l’analyse de données.
Résultat →
espece
fortis 6
fuliginosa 5
magnirostris 4
Name: count, dtype: int64
L’échantillon compte 6 fortis, 5 fuliginosa et 4 magnirostris.
Résultat →
bec_long aile masse
espece
fortis 12.98 74.8 21.5
fuliginosa 9.24 67.4 15.2
magnirostris 16.05 80.0 28.0
En une ligne, groupby révèle le profil de chaque espèce : magnirostris a le bec le plus long, l’aile la plus grande et la masse la plus élevée ; fuliginosa est la plus petite sur les trois mesures.
df["masse"] (crochets simples). Avec une liste de noms, df[["espece", "masse"]], on obtient un DataFrame (crochets doubles).loc (étiquette) vs iloc (position) : df.loc[0] cible l’étiquette 0 ; df.iloc[0] la première ligne.NaN n’est pas 0 : une valeur manquante doit être traitée (dropna, fillna).df[df["masse"] > 25] renvoie une nouvelle vue ; on l’affecte à une variable pour la garder.L’essentiel
DataFrame : une table à colonnes nommées, bâtie sur NumPy ; Series : une colonne.
Créer / charger : pd.DataFrame({...}), read_csv, to_csv.
Explorer : shape, info(), describe(), head().
Sélectionner : df["col"], df[["c1", "c2"]], df.loc[...].
Filtrer : masque booléen df[df["col"] > v].
Créer une colonne : à partir des colonnes existantes (vectorisé). Trier : sort_values.
Manquantes : isna, dropna, fillna. Grouper : value_counts, groupby("col").mean().
Séance 8 — Visualiser et faire le pont
On sait charger et résumer une table. La Séance 8 la visualise — histogrammes, nuages de points colorés par espèce — puis fait le pont vers le Machine Learning : la table devient une matrice X (les mesures) et un vecteur y (l’espèce à prédire).
À faire d’ici là : refaire les cellules « À vous » du notebook de la séance.