Skip to content

pandas : Supprimer les valeurs manquantes (NaN) avec dropna()

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