
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
