Pandas DataFrame fillna() Example: Handling Missing Values in Python

janvier 26, 2026

comment Aucun commentaire

Par Colin Barthet

Tu traites des données avec pandas et tu tombes sur des cases vides, des NaN ? C’est comme planifier un road-trip et avoir des trous dans ton itinéraire : ça bloque tout. La méthode .fillna() est ton outil magique pour combler ces trous et rendre ton DataFrame exploitable. Ici, pas de blabla théorique, je te donne le guide ultime, pratique, avec les syntaxes et les pièges à éviter en 2025. 🛠️

En résumé rapide : DataFrame.fillna() remplace les valeurs manquantes (NaN) par ce que tu décides : un chiffre fixe, la moyenne, ou en copiant la valeur précédente/suivante. Par défaut, elle crée une nouvelle copie de tes données.

📌 Ce que tu vas apprendre

  • La syntaxe exacte de .fillna() et ses paramètres clés.
  • 6 cas concrets d’utilisation avec du code prêt à l’emploi.
  • La bonne pratique à adopter absolument avec les versions récentes de pandas (2.0+).
  • Les alternatives quand .fillna() n’est pas la meilleure solution.

Syntaxe de base : Ton kit de démarrage

Voici la commande, avec les options qui comptent vraiment. Pense à chaque paramètre comme un réglage de ton voyage.

df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)

Paramètre À quoi ça sert ? Valeur typique
value La valeur de remplacement (un nombre, un texte, un dictionnaire). 0, {'A': 0, 'B': 'manquant'}
method Remplir avec la valeur d’avant ('ffill') ou d’après ('bfill'). Déprécié, utilise plutôt .ffill(). None (par défaut)
inplace Si True, modifie directement ton DataFrame. Danger : opération irréversible. False
limit Limite le nombre de remplacements consécutifs. Super utile pour éviter de « trop remplir ». 1, 2

6 façons d’utiliser .fillna() (comme un pro)

Passons à la pratique. Voici les scénarios que tu rencontreras 90% du temps.

1. Remplacer par une valeur fixe (le classique)

Parfait pour les données numériques où un zéro a du sens (ex: nombre de ventes) ou pour les catégories textuelles.

import pandas as pd
import numpy as np

df = pd.DataFrame({'Prix': [99, np.nan, 149], 'Ville': ['Paris', np.nan, 'Lyon']})
df_rempli = df.fillna(0) # Pour les nombres
# Ou pour du texte :
df['Ville'] = df['Ville'].fillna('Non renseigné')
print(df_rempli)

2. Une valeur différente par colonne (la précision)

Tu ne remplaces pas un prix manquant et une ville manquante de la même façon ! Utilise un dictionnaire.

valeurs_sur_mesure = {'Prix': df['Prix'].median(), 'Ville': 'Inconnue'}
df_rempli = df.fillna(valeurs_sur_mesure)

3. Propagation des valeurs (ffill / bfill)

⚠️ Attention, changement 2025 : L’option method='ffill' dans .fillna() est dépréciée. Utilise désormais les méthodes dédiées .ffill() et .bfill(). C’est plus clair et maintenable.

# Forward fill : remplace par la valeur précédente valide
df_complete = df.ffill()
# Backward fill : remplace par la valeur suivante valide
df_complete = df.bfill()
# Tu peux combiner limit
df_complete = df.ffill(limit=1)  # Ne remplit qu'un NaN consécutif

4. Remplacer par une statistique (moyenne, médiane)

La technique « safe » pour les colonnes numériques sans trop fausser les données.

# Moyenne de la colonne
df['Prix'] = df['Prix'].fillna(df['Prix'].mean())
# Médiane (moins sensible aux outliers)
df['Prix'] = df['Prix'].fillna(df['Prix'].median())

5. Limiter la propagation (pour garder du réalisme)

Si tu as une longue série de NaN, les remplir tous par la même valeur peut être trompeur. limit est ton garde-fou.

série = pd.Series([1, np.nan, np.nan, np.nan, 5])
# Ne remplit que le premier NaN trouvé
série_limitee = série.ffill(limit=1)
print(série_limitee)
# Résultat : 1, 1, NaN, NaN, 5

6. Remplir le long des colonnes (axis=1)

Un cas plus rare mais utile : prendre la valeur de la colonne de gauche pour remplir celle de droite.

df_large = pd.DataFrame({'Col_A': [10, np.nan], 'Col_B': [np.nan, 20], 'Col_C': [np.nan, np.nan]})
df_horizontal = df_large.ffill(axis=1)
print(df_horizontal)

🚨 Piège à éviter absolument

L’argument inplace=True modifie ton DataFrame original sans retour. C’est pratique mais dangereux : tu perds tes données d’origine. La bonne pratique en 2025 ? Évite inplace=True et assigne le résultat à une nouvelle variable (df_nouveau = df.fillna(...)). Ça te laisse une porte de sortie en cas d’erreur.

FAQ : Les questions que tu te poses

🤔 Quelle est la différence entre .fillna() et .dropna() ?

.fillna() comble les valeurs manquantes. .dropna() les supprime (en supprimant les lignes ou colonnes concernées). Le choix dépend du contexte : utilise .dropna() si les NaN sont très nombreux et non significatifs, sinon, .fillna() est préférable pour conserver la structure de tes données. Pour un guide complet sur .dropna(), consulte la documentation officielle pandas.

🎯 Comment gérer les valeurs manquantes uniquement dans certaines colonnes ?

Cible la colonne directement : df['ma_colonne'] = df['ma_colonne'].fillna(valeur). C’est plus propre et plus efficace que de remplir tout le DataFrame. Pour des stratégies avancées de sélection de données, des sites comme Real Python proposent d’excellents tutoriels.

⚠️ Pourquoi mon .fillna() ne fonctionne pas ?

Vérifie ces points :

  1. La valeur manquante est-elle bien un NaN (numpy.nan) ? Un espace ou le texte « NA » ne seront pas reconnus.
  2. Utilises-tu inplace=True ? Dans ce cas, rien n’est retourné, le changement est direct sur ta variable.
  3. As-tu bien assigné le résultat ? Si inplace=False (défaut), il faut faire : df = df.fillna(...).

En cas de doute, consulte les forums dédiés comme Stack Overflow.

Conclusion

Maîtriser .fillna() (et ses alternatives modernes comme .ffill()), c’est s’éviter des heures de nettoyage manuel de données. La clé est de choisir une stratégie de remplacement adaptée au sens de ta colonne : un zéro, une moyenne, une valeur précédente ou un texte par défaut. N’oublie pas la règle d’or : évite inplace=True pour garder le contrôle. Maintenant, tes DataFrames n’ont plus de raisons d’avoir des trous !

Laisser un commentaire