OUJOOD.COM
Ce que Pandas appelle NaN
Pandas représente les valeurs manquantes par NaN — abréviation de Not a Number, empruntée au standard IEEE 754 des nombres flottants. En pratique, NaN apparaît chaque fois qu'une cellule est vide dans un fichier source, qu'une valeur n'a pas pu être convertie, ou qu'un calcul impliquait une donnée absente.
Un point à connaître : NaN != NaN en Python. Vous ne pouvez pas comparer une valeur à NaN avec ==. Pandas fournit isnull() et isna() (alias identiques) pour faire ce travail correctement.
Détecter les valeurs manquantes
Trois façons de repérer les NaN dans un DataFrame, selon le niveau de détail voulu :
import pandas as pd
import numpy as np
data = {
"nom": ["Alice", "Bob", None, "David"],
"âge": [28, None, 22, 45],
"salaire": [2800.0, 3500.0, np.nan, 4100.0]
}
df = pd.DataFrame(data)
# Masque booléen : True là où il y a un NaN
print(df.isnull())
# Nombre de NaN par colonne
print(df.isnull().sum())
# Pourcentage de NaN par colonne
print((df.isnull().sum() / len(df) * 100).round(1))
None et np.nan sont tous les deux reconnus comme valeurs manquantes par Pandas — isnull() retourne True pour les deux. La différence est technique : None est un objet Python, np.nan est un flottant. Dans un DataFrame Pandas, les deux sont normalisés en NaN lors du chargement.
Supprimer les lignes ou colonnes avec des NaN
dropna() supprime par défaut toute ligne qui contient au moins un NaN. Des paramètres permettent de contrôler ce comportement selon le seuil de tolérance que vous acceptez.
import pandas as pd
import numpy as np
data = {
"nom": ["Alice", "Bob", None, "David", "Eva"],
"âge": [28, None, 22, 45, 31],
"salaire": [2800.0, 3500.0, np.nan, 4100.0, np.nan],
"ville": ["Paris", "Lyon", None, "Bordeaux", "Nantes"]
}
df = pd.DataFrame(data)
# Supprimer toutes les lignes avec au moins 1 NaN (par défaut)
print(df.dropna())
# Supprimer seulement les lignes où TOUTES les valeurs sont NaN
print(df.dropna(how="all"))
# Garder les lignes avec au moins 3 valeurs non-NaN
print(df.dropna(thresh=3))
# Supprimer les NaN uniquement sur certaines colonnes
print(df.dropna(subset=["nom", "âge"]))
subset=["nom", "âge"] est le paramètre le plus utile en pratique : vous ne supprimez que les lignes où les colonnes essentielles sont manquantes, sans vous soucier des colonnes secondaires. Une ligne sans salaire peut rester exploitable ; une ligne sans identifiant ne l'est souvent pas.
Remplir les valeurs manquantes avec fillna()
fillna() remplace les NaN par une valeur de votre choix. La stratégie de remplissage dépend du type de données et du contexte : une valeur fixe, la moyenne de la colonne, ou la valeur précédente ou suivante.
import pandas as pd
import numpy as np
data = {
"nom": ["Alice", "Bob", None, "David"],
"âge": [28, None, 22, 45],
"salaire": [2800.0, 3500.0, np.nan, 4100.0]
}
df = pd.DataFrame(data)
# Remplacer les NaN par une valeur fixe par colonne
df["nom"] = df["nom"].fillna("Inconnu")
# Remplacer les NaN numériques par la moyenne de la colonne
df["âge"] = df["âge"].fillna(df["âge"].mean())
# Propagation : remplir avec la valeur précédente (forward fill)
df["salaire"] = df["salaire"].ffill()
# Propagation inverse : remplir avec la valeur suivante (backward fill)
df["salaire"] = df["salaire"].bfill()
print(df)
ffill() (forward fill) propage la dernière valeur connue vers le bas — utile pour des séries temporelles où une valeur manquante peut raisonnablement reprendre la valeur précédente. bfill() fait l'inverse. Remplir par la moyenne convient aux colonnes numériques sans trop de biais ; remplacer par une chaîne fixe convient aux colonnes texte catégorielles.
Avant de remplir ou supprimer, posez-vous toujours la question : pourquoi cette valeur est-elle manquante ? Une absence aléatoire (erreur de saisie) ne se traite pas comme une absence structurelle (champ non applicable). Remplir aveuglément par la moyenne peut introduire un biais silencieux dans vos analyses.
Par carabde | Mis à jour le 26 avril 2026