Python - Nettoyage des données
Les données manquantes sont toujours un problème dans les scénarios de la vie réelle. Des domaines tels que l'apprentissage automatique et l'exploration de données sont confrontés à de graves problèmes de précision de leurs prédictions de modèle en raison de la mauvaise qualité des données causée par des valeurs manquantes. Dans ces domaines, le traitement des valeurs manquantes est un objectif majeur pour rendre leurs modèles plus précis et valides.
Quand et pourquoi des données sont-elles manquées?
Prenons une enquête en ligne pour un produit. Souvent, les gens ne partagent pas toutes les informations les concernant. Peu de gens partagent leur expérience, mais pas depuis combien de temps ils utilisent le produit; peu de personnes partagent la durée d'utilisation du produit, leur expérience mais pas leurs coordonnées. Ainsi, d'une manière ou d'une autre, une partie des données est toujours manquante, ce qui est très courant en temps réel.
Voyons maintenant comment nous pouvons gérer les valeurs manquantes (disons NA ou NaN) à l'aide de Pandas.
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
En utilisant la réindexation, nous avons créé un DataFrame avec des valeurs manquantes. Dans la sortie,NaN veux dire Not a Number.
Vérifier les valeurs manquantes
Pour faciliter la détection des valeurs manquantes (et pour différents types de baie), Pandas fournit le isnull() et notnull() fonctions, qui sont également des méthodes sur les objets Series et DataFrame -
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
Ses output est comme suit -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Nettoyage / remplissage des données manquantes
Pandas fournit diverses méthodes pour nettoyer les valeurs manquantes. La fonction fillna peut «remplir» les valeurs NA avec des données non nulles de plusieurs manières, que nous avons illustrées dans les sections suivantes.
Remplacez NaN par une valeur scalaire
Le programme suivant montre comment remplacer "NaN" par "0".
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
Ses output est comme suit -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
Ici, nous remplissons avec la valeur zéro; à la place, nous pouvons également remplir avec toute autre valeur.
Remplir NA en avant et en arrière
En utilisant les concepts de remplissage discutés dans le chapitre sur la réindexation, nous remplirons les valeurs manquantes.
Méthode | action |
---|---|
remplissage / remplissage | Méthodes de remplissage Suivant |
bfill / remblai | Méthodes de remplissage vers l'arrière |
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Supprimer les valeurs manquantes
Si vous souhaitez simplement exclure les valeurs manquantes, utilisez le dropna fonction avec le axisargument. Par défaut, axis = 0, c'est-à-dire le long de la ligne, ce qui signifie que si une valeur dans une ligne est NA, alors la ligne entière est exclue.
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
Ses output est comme suit -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Remplacer les valeurs génériques manquantes (ou)
Plusieurs fois, nous devons remplacer une valeur générique par une valeur spécifique. Nous pouvons y parvenir en appliquant la méthode replace.
Le remplacement de NA par une valeur scalaire est un comportement équivalent du fillna() fonction.
Exemple
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000],
'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Ses output est comme suit -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60