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