• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 05/08/2019

Manipulez les données contenues dans vos DataFrames

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Maintenant que vous savez comment créer un DataFrame, intéressons à d'autres opérations usuelles sur les données. Pour ce faire, je vous propose d'utiliser un DataSet disponible dans la librairie Seaborn ! Le dataset en question comprend des données sur les survivants du naufrage du Titanic !

Dans ce chapitre, nous allons suivre une session de travail "typique".

import numpy as np
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')

Aperçu rapide

La première chose à faire est de jeter un rapide coup d'oeil à nos données.

titanic.head()
Aperçu du dataset Titanic
Aperçu du dataset Titanic

Jetons un coup d'oeil à tous les âges. La fonction unique renvoie les valeurs uniques présentes dans une structure de données Pandas.

titanic.age.unique()
array([22. , 38. , 26. , 35. , nan, 54. , 2. , 27. , 14. ,
 4. , 58. , 20. , 39. , 55. , 31. , 34. , 15. , 28. ,
 8. , 19. , 40. , 66. , 42. , 21. , 18. , 3. , 7. ,
 49. , 29. , 65. , 28.5 , 5. , 11. , 45. , 17. , 32. ,
 16. , 25. , 0.83, 30. , 33. , 23. , 24. , 46. , 59. ,
 71. , 37. , 47. , 14.5 , 70.5 , 32.5 , 12. , 9. , 36.5 ,
 51. , 55.5 , 40.5 , 44. , 1. , 61. , 56. , 50. , 36. ,
 45.5 , 20.5 , 62. , 41. , 52. , 63. , 23.5 , 0.92, 43. ,
 60. , 10. , 64. , 13. , 48. , 0.75, 53. , 57. , 80. ,
 70. , 24.5 , 6. , 0.67, 30.5 , 0.42, 34.5 , 74. ])

Mentionnons aussi l'excellente fonction  describe . Elle donne des statistiques diverses (moyenne, maximum, minimum, etc.) sur les données contenues dans chaque colonne:

titanic.describe(include="all")
Description de titanic
Description de titanic

L'argument include="all" sert à inclure les colonnes non-numérique dans l'analyse. Cette fonction nous fournit pleins de données très utiles sur la répartition de nos données (minimum, maximum, moyenne, etc.)

Données manquantes

 Vous aurez remarqué, dans la sortie de la fonction  describe  , des valeurs  NaN  . C'est une valeur définie pour représenter quelque chose qui n'est pas un nombre (Not a Number) alors que son type l'exige. Par exemple, on obtient NaN si on demande à Pandas de calculer la moyenne d'une colonne de texte. 

Plus généralement, le résultat de toute opération impliquant une NaN est à son tour un NaN. Par exemple, si une de vos colonnes contient une NaN (parce que la vraie valeur n'est pas connue), le résultat de toutes les opérations arithmétiques qui impliquent cette valeur (comme la moyenne de la colonne) sera NaN, sauf si vous prenez soin de ne pas prendre en compte cette valeur (Pandas le fait, par exemple sur la colonne age, dans notre exemple).

Le traitement à des valeurs manquantes est abordé dans un autre cours. Nous allons simplement voir deux opérations à appliquer aux NaN.

La première consiste à remplacer les NaN par d'autres valeurs. Cette opération s'effectue grâce à la fonction  fillna  .  Regardons son application sur la colonne  age  .

titanic.age.head(10)
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 NaN
6 54.0
7 2.0
8 27.0
9 14.0
Name: age, dtype: float64
titanic.fillna(value={"age": 0}).age.head(10)

Renvoie un DataFrame où toutes les  NaN  dans la colonne  age  on été remplacés par 0.

0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 0.0
6 54.0
7 2.0
8 27.0
9 14.0
Name: age, dtype: float64

Nous aurions aussi pu remplir les NaN par les valeurs précédentes:

titanic.fillna(method="pad").age.head(10)
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 35.0
6 54.0
7 2.0
8 27.0
9 14.0
Name: age, dtype: float64

Enfin, la fonction  dropna  permet de supprimer les axes (colonnes ou lignes) qui contiennent des NaN. Par défaut, elle supprime les lignes concernées:

titanic.dropna().head(10)
DropNa
Fonction DropNa

Mais on peut aussi lui demander de supprimer carrément les colonnes!

titanic.dropna(axis="columns").head()

Supprimer les colonnes
Supprimer les colonnes avec DropNa

Renommer une colonne

La fonction rename permet de renommer les colonnes ou les lignes d'un DataFrame. Elle s'utilise de deux façon.

titanic.rename(columns={"sex":"sexe"})

Renomme la colonne "sex" en "sexe". Tandis que:

f = lambda x: x+1
titanic.rename(index=f)

applique la fonction  f  à tous les index. 

Supprimer des axes

La fonction  drop  permet de supprimer des axes (colonnes ou lignes) d'un DataFrame. Son utilisation est plutôt simple.

titanic.drop(0)

Supprimera la ligne dont l'index est égal à 0.

titanic.drop(columns=["age"])

Supprime la colonne "age"

Tableaux croisés dynamiques

Avant de vous lancer dans l'algèbre relationnelle, mentionnons les tableaux croisés dynamiques. Vous êtes peut-être familier avec ce concept, par exemple parce que vous les avez utilisé dans des logiciels tableurs.

Ces tableaux, encore appelés tables de pivots (ou pivot table), permettent de synthétiser les données contenues dans un DataFrame. Essayons de voir cela par l'exemple.

Pour voir la répartition des survivants en fonction de leurs sexes et de leur type de billet, nous n'avons besoin que d'une seule ligne:

titanic.pivot_table('survived', index='sex', columns='class')

Le résultat est parfaitement compréhensible:

Taux de survie
Taux de survie

Par défaut, la fonction pivot_table groupe les données en fonction des critères que nous spécifions, et agrège les résultats en moyenne. Nous pouvons spécifier d'autres fonctions. Par exemple, si nous voulons savoir quelle est le nombre total de survivants dans chaque cas, nous utiliserons la fonction  sum  .

titanic.pivot_table('survived', index='sex', columns='class', aggfunc="sum")
Le nombre de survivants
Le nombre de survivants

La fonction pivot_table est très puissante, et permet même de faire des agrégations à plusieurs niveaux. Par exemple, nous pouvons voir l'âge des survivants comme une dimension supplémentaires. Le nombre exact d'années nous intéressant peu, nous regrouperons les âge en trois catégories, grâce à la fonction  cut  .

titanic.dropna(inplace=True)
age = pd.cut(titanic['age'], [0, 18, 80])
titanic.pivot_table('survived', ['sex', age], 'class')

Le résultat est un DataFrame multi-indexé:

Agrégation à plusieurs niveaux
Agrégation à plusieurs niveaux

Remarquez les deux niveaux d'indexation à gauche.

Voilà. J'espère que vous avez une meilleure idée des capacités de Pandas. Dans le chapitre suivant, vous allez voir comment effectuer des opérations d'algèbre linéaires (comme dans le langage SQL) sur les DataFrames.

Exemple de certificat de réussite
Exemple de certificat de réussite