
Vous pouvez supprimer les valeurs manquantes (NaN) de pandas.DataFrame, Series avec dropna().
Cet article décrit le contenu suivant.
- Supprimez les lignes/colonnes où tous les éléments manquent de valeurs :
how='all' - Supprimez les lignes/colonnes contenant au moins une valeur manquante :
how='any' (default) - Supprimez les lignes/colonnes en fonction du nombre de valeurs non manquantes :
thresh - Supprimer en fonction de lignes/colonnes spécifiques :
subset - Opérer sur place :
inplace - Pour les pandas.Série
Si vous souhaitez extraire des lignes et des colonnes avec des valeurs manquantes, consultez l’article suivant.
Consultez les articles suivants pour savoir comment remplacer et compter les valeurs manquantes.
Notez que non seulement NaN (Not a Number) mais aussi None est traité comme une valeur manquante dans les pandas.
Par exemple, lisez un fichier CSV avec des valeurs manquantes avec read_csv().
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Supprimez les lignes/colonnes où tous les éléments manquent de valeurs :how='all'
En définissant how=’all’, les lignes où tous les éléments manquent de valeurs sont supprimées.
print(df.dropna(how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Si l’axe est défini sur 1 ou ‘colonnes’, les colonnes où tous les éléments manquent de valeurs sont supprimées.
print(df.dropna(how='all', axis=1))
# name age state point
# 0 Alice 24.0 NY NaN
# 1 NaN NaN NaN NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Notez que si l’axe est défini sur 0 ou ‘index’, les lignes sont supprimées. Étant donné que la valeur par défaut de l’axe est 0, les lignes sont supprimées si elles sont omises, comme indiqué dans le premier exemple.
Dans les anciennes versions, les lignes et les colonnes étaient supprimées avec axis=[0, 1], mais depuis la version 1.0.0, l’axe ne peut plus être spécifié avec une liste ou un tuple.
Si vous souhaitez supprimer à la fois des lignes et des colonnes, vous pouvez appliquer à plusieurs reprises dropna().
# print(df.dropna(how='all', axis=[0, 1]))
# TypeError: supplying multiple axes to axis is no longer supported.
print(df.dropna(how='all').dropna(how='all', axis=1))
# name age state point
# 0 Alice 24.0 NY NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Supprimez les lignes/colonnes contenant au moins une valeur manquante :how='any' (default)
Pour utiliser comme exemple, supprimez les lignes et les colonnes où toutes les valeurs sont des valeurs manquantes.
df2 = df.dropna(how='all').dropna(how='all', axis=1)
print(df2)
# name age state point
# 0 Alice 24.0 NY NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
En définissant how=’any’, les lignes contenant au moins une valeur manquante sont supprimées. Étant donné que la valeur par défaut de how est ‘any’, le résultat est le même même s’il est omis.
print(df2.dropna(how='any'))
# name age state point
# 3 Dave 68.0 TX 70.0
print(df2.dropna())
# name age state point
# 3 Dave 68.0 TX 70.0
Si l’axe est défini sur 1 ou sur « colonnes », les colonnes contenant au moins une valeur manquante sont supprimées.
print(df2.dropna(axis=1))
# name
# 0 Alice
# 2 Charlie
# 3 Dave
# 4 Ellen
# 5 Frank
Supprimez les lignes/colonnes en fonction du nombre de valeurs non manquantes :thresh
Avec l’argument thresh, vous pouvez supprimer des lignes et des colonnes en fonction du nombre de valeurs non manquantes.
Par exemple, si thresh=3, les lignes contenant plus de trois valeurs non manquantes sont conservées et les autres lignes sont supprimées.
print(df.dropna(thresh=3))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
Si l’axe est défini sur 1 ou ‘colonnes’, les colonnes sont supprimées.
print(df.dropna(thresh=3, axis=1))
# name age state
# 0 Alice 24.0 NY
# 1 NaN NaN NaN
# 2 Charlie NaN CA
# 3 Dave 68.0 TX
# 4 Ellen NaN CA
# 5 Frank 30.0 NaN
Supprimer en fonction de lignes/colonnes spécifiques :subset
Si vous souhaitez supprimer en fonction de lignes et de colonnes spécifiques, spécifiez une liste d’étiquettes de lignes/colonnes (noms) dans l’argument de sous-ensemble de dropna(). Même si vous ne souhaitez définir qu’un seul libellé, vous devez le spécifier sous forme de liste, comme subset=[‘name’].
Étant donné que la valeur par défaut est how=’any’ et axis=0, les lignes avec des valeurs manquantes dans les colonnes spécifiées par subset sont supprimées.
print(df.dropna(subset=['age']))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 5 Frank 30.0 NaN NaN NaN
print(df.dropna(subset=['age', 'state']))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
Si how est défini sur ‘all’, les lignes avec des valeurs manquantes dans toutes les colonnes spécifiées sont supprimées.
print(df.dropna(subset=['age', 'state'], how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 4 Ellen NaN CA 88.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Si l’axe est défini sur 1 ou ‘colonnes’, les colonnes sont supprimées.
print(df.dropna(subset=[0, 4], axis=1))
# name state
# 0 Alice NY
# 1 NaN NaN
# 2 Charlie CA
# 3 Dave TX
# 4 Ellen CA
# 5 Frank NaN
print(df.dropna(subset=[0, 4], axis=1, how='all'))
# name age state point
# 0 Alice 24.0 NY NaN
# 1 NaN NaN NaN NaN
# 2 Charlie NaN CA NaN
# 3 Dave 68.0 TX 70.0
# 4 Ellen NaN CA 88.0
# 5 Frank 30.0 NaN NaN
Une erreur est générée si un nom de ligne ou de colonne inexistant est spécifié. Une erreur est également générée si vous définissez axis=1 mais spécifiez des noms de colonnes ou définissez axis=0 (par défaut) mais spécifiez des noms de lignes.
# print(df.dropna(subset=['age', 'state', 'xxx']))
# KeyError: ['xxx']
# print(df.dropna(subset=['age', 'state'], axis=1))
# KeyError: ['age', 'state']
Opérer sur place :inplace
Comme indiqué dans les exemples ci-dessus, par défaut, un nouvel objet est renvoyé et l’objet d’origine n’est pas modifié, mais si inplace=True, l’objet d’origine lui-même est mis à jour.
df.dropna(subset=['age'], inplace=True)
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 3 Dave 68.0 TX 70.0 NaN
# 5 Frank 30.0 NaN NaN NaN
Pour les pandas.Série
Le seul argument valide pour dropna() de pandas.Series est inplace. Comme il s’agit de données unidimensionnelles, les éléments avec des valeurs manquantes sont simplement supprimés.
s = pd.read_csv('data/src/sample_pandas_normal_nan.csv')['age']
print(s)
# 0 24.0
# 1 NaN
# 2 NaN
# 3 68.0
# 4 NaN
# 5 30.0
# Name: age, dtype: float64
print(s.dropna())
# 0 24.0
# 3 68.0
# 5 30.0
# Name: age, dtype: float64
s.dropna(inplace=True)
print(s)
# 0 24.0
# 3 68.0
# 5 30.0
# Name: age, dtype: float64
