Skip to content

Valeurs manquantes dans pandas (nan, None, pd.NA)

Dans les pandas, une valeur manquante (NA : non disponible) est principalement représentée par nan (pas un nombre). Aucun est également considéré comme une valeur manquante.

Cet article décrit le contenu suivant.

  • Valeurs manquantes causées par la lecture de fichiers, etc.
  • nan (pas un nombre) est considéré comme une valeur manquante
  • Aucun est également considéré comme une valeur manquante
  • La chaîne n’est pas considérée comme une valeur manquante
  • Infinity inf n’est pas considéré comme une valeur manquante par défaut
  • pd.NA est la valeur expérimentale (à partir de 1.4.0)

Valeurs manquantes causées par la lecture de fichiers, etc.

Si vous lisez un fichier CSV avec des valeurs manquantes, nan est généré. Dans la sortie print() de pandas.DataFrame et Series, il est écrit comme NaN.

import math

import numpy as np
import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')[:3]
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

Des méthodes telles que isnull(), dropna() et fillna() peuvent être utilisées pour détecter, supprimer et remplacer les valeurs manquantes.

print(df.isnull())
#     name    age  state  point  other
# 0  False  False  False   True   True
# 1   True   True   True   True   True
# 2  False   True  False   True   True

print(df.dropna(how='all'))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 2  Charlie   NaN    CA    NaN    NaN

print(df.fillna(0))
#       name   age state  point  other
# 0    Alice  24.0    NY    0.0    0.0
# 1        0   0.0     0    0.0    0.0
# 2  Charlie   0.0    CA    0.0    0.0

nan dans une colonne avec objet est un type float intégré Python, et nan dans une colonne avec floatXX est un type NumPy numpy.floatXX. Les deux sont traités comme des valeurs manquantes.

print(df.dtypes)
# name      object
# age      float64
# state     object
# point    float64
# other    float64
# dtype: object

print(df.at[1, 'name'])
# nan

print(type(df.at[1, 'name']))
# <class 'float'>

print(df.at[1, 'age'])
# nan

print(type(df.at[1, 'age']))
# <class 'numpy.float64'>

En plus de lire un fichier, nan est utilisé pour représenter une valeur manquante si l’élément n’existe pas lors de l’appel de méthodes telles que reindex(), merge(), etc.

nan (pas un nombre) est considéré comme une valeur manquante

En Python, vous pouvez créer nan avec float(‘nan’), math.nan ou np.nan. nan est considéré comme une valeur manquante dans les pandas.

s_nan = pd.Series([float('nan'), math.nan, np.nan])
print(s_nan)
# 0   NaN
# 1   NaN
# 2   NaN
# dtype: float64

print(s_nan.isnull())
# 0    True
# 1    True
# 2    True
# dtype: bool

Aucun est également considéré comme une valeur manquante

Dans les pandas, None est également traité comme une valeur manquante. None est une constante intégrée en Python.

print(None)
# None

print(type(None))
# <class 'NoneType'>

Pour les colonnes numériques, None est converti en nan lors de la création d’un DataFrame ou d’une série contenant None, ou lorsque None est affecté à un élément.

s_none_float = pd.Series([None, 0.1, 0.2])
s_none_float[2] = None
print(s_none_float)
# 0    NaN
# 1    0.1
# 2    NaN
# dtype: float64

print(s_none_float.isnull())
# 0     True
# 1    False
# 2     True
# dtype: bool

Puisque nan est un nombre à virgule flottante float, si None est converti en nan, le type de données dtype de la colonne est changé en float, même si les autres valeurs sont des entiers int.

s_none_int = pd.Series([None, 1, 2])
print(s_none_int)
# 0    NaN
# 1    1.0
# 2    2.0
# dtype: float64

Bien que None dans la colonne d’objet reste sur None, il est détecté comme une valeur manquante par isnull(). Bien sûr, il est également géré par des méthodes telles que dropna() et fillna().

s_none_object = pd.Series([None, 'abc', 'xyz'])
print(s_none_object)
# 0    None
# 1     abc
# 2     xyz
# dtype: object

print(s_none_object.isnull())
# 0     True
# 1    False
# 2    False
# dtype: bool

print(s_none_object.fillna(0))
# 0      0
# 1    abc
# 2    xyz
# dtype: object

La chaîne n’est pas considérée comme une valeur manquante

Les chaînes ‘NaN’ et ‘None’ sont indiscernables à l’affichage, mais ne sont pas considérées comme des valeurs manquantes. La chaîne vide  » n’est pas non plus traitée comme une valeur manquante.

s_str = pd.Series(['NaN', 'None', ''])
print(s_str)
# 0     NaN
# 1    None
# 2        
# dtype: object

print(s_str.isnull())
# 0    False
# 1    False
# 2    False
# dtype: bool

Si vous souhaitez traiter la valeur comme une valeur manquante, vous pouvez utiliser la méthode replace() pour la remplacer par float(‘nan’), np.nan et math.nan.

s_replace = s_str.replace(['NaN', 'None', ''], float('nan'))
print(s_replace)
# 0   NaN
# 1   NaN
# 2   NaN
# dtype: float64

print(s_replace.isnull())
# 0    True
# 1    True
# 2    True
# dtype: bool

Notez que les fonctions de lecture de fichiers telles que read_csv() considèrent  », ‘NaN’, ‘null’, etc., comme des valeurs manquantes par défaut et les remplacent par nan.

Infinity inf n’est pas considéré comme une valeur manquante par défaut

Infinity inf n’est pas considéré comme une valeur manquante par défaut.

s_inf = pd.Series([float('inf'), -float('inf')])
print(s_inf)
# 0    inf
# 1   -inf
# dtype: float64

print(s_inf.isnull())
# 0    False
# 1    False
# dtype: bool

Si pd.options.mode.use_inf_as_na est défini sur True, inf dans pandas.DataFrame et Series est converti en nan et traité comme une valeur manquante. Contrairement à None, inf dans la colonne object est également converti en nan.

pd.options.mode.use_inf_as_na = True

print(s_inf)
# 0   NaN
# 1   NaN
# dtype: float64

print(s_inf.isnull())
# 0    True
# 1    True
# dtype: bool

s_inf_object = pd.Series([float('inf'), -float('inf'), 'abc'])
print(s_inf_object)
# 0    NaN
# 1    NaN
# 2    abc
# dtype: object

print(s_inf_object.isnull())
# 0     True
# 1     True
# 2    False
# dtype: bool

Consultez l’article suivant sur la façon de définir des options dans les pandas.

pd.NA est la valeur expérimentale (à partir de 1.4.0)

pd.NA a été introduit en tant que scalaire NA expérimental dans pandas 1.0.0.

print(pd.NA)
# 

print(type(pd.NA))
# <class 'pandas._libs.missing.NAType'>

Alors que nan == nan vaut False, pd.NA == pd.NA vaut pd.NA comme dans le langage R.

print(float('nan') == float('nan'))
# False

print(pd.NA == pd.NA)
# 

Bien sûr, pd.NA est traité comme une valeur manquante.

s_na = pd.Series([None, 1, 2], dtype='Int64')
print(s_na)
# 0    
# 1       1
# 2       2
# dtype: Int64

print(s_na.isnull())
# 0     True
# 1    False
# 2    False
# dtype: bool

print(s_na.fillna(0))
# 0    0
# 1    1
# 2    2
# dtype: Int64

Consultez le document suivant pour Int64 dans l’exemple de code ci-dessus. Même s’il contient des valeurs manquantes, les autres valeurs entières ne sont pas converties en nombres à virgule flottante.

Notez qu’à partir de la version 1.4.0 (février 2022), il est toujours « expérimental » et son comportement peut changer.

Avertissement
Expérimental : le comportement de pd.NA peut encore changer sans avertissement.
Travailler avec des données manquantes – Scalaire NA expérimental pour indiquer les valeurs manquantes – documentation pandas 1.4.0