Nettoyage de données avec Pandas

Le nettoyage des données est le processus de traitement des données inutiles.

De nombreux jeux de données contiennent des données manquantes, des formats de données incorrects, des données erronées ou des données en double. Pour rendre l'analyse des données plus précise, vous devez traiter ces données inutiles.

Étapes courantes du nettoyage et du prétraitement des données :

  1. Traitement des valeurs manquantes: Identifier et remplir les valeurs manquantes, ou supprimer les lignes/colonnes contenant des valeurs manquantes.

  2. Traitement des données en double: Vérifier et supprimer les données en double pour garantir que chaque enregistrement est unique.

  3. Traitement des valeurs aberrantes: Identifier et traiter les valeurs aberrantes, telles que les valeurs extrêmes et les valeurs erronées.

  4. Conversion de format de données: Convertir les types de données ou effectuer des conversions d'unités, telles que la conversion de format de date.

  5. Standardisation et normalisation: Standardiser (par exemple, Z-score) ou normaliser (par exemple, Min-Max) les données numériques.

  6. Encodage des données catégorielles: Convertir les variables catégorielles en forme numérique. Les méthodes courantes incluent l'encodage One-Hot et l'encodage par étiquette.

  7. Traitement de texte: Nettoyer les données textuelles, telles que la suppression des mots vides, la racinisation, la tokenisation, etc.

  8. Échantillonnage des données: Tirer des échantillons de l'ensemble de données, ou gérer le déséquilibre des classes par suréchantillonnage/sous-échantillonnage.

  9. Ingénierie des caractéristiques: Créer de nouvelles caractéristiques, supprimer les caractéristiques non pertinentes, sélectionner les caractéristiques importantes, etc.

Dans ce tutoriel, nous utiliserons le package Pandas pour le nettoyage des données.

Les données de test utilisées dans cet articleproperty-data.csvsont les suivantes :

Le tableau ci-dessus contient quatre types de données nulles :

  • n/a
  • N/D
  • —
  • na

Nettoyage des valeurs nulles avec Pandas

Si nous voulons supprimer les lignes contenant des champs vides, nous pouvons utiliser la méthodedropna(), la syntaxe est la suivante :

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

Description du paramètre :

  • axis : par défaut,0signifie supprimer la ligne entière lorsqu'une valeur nulle est rencontrée ; si le paramètre est défini suraxis=1cela signifie supprimer la colonne entière lorsqu'une valeur nulle est rencontrée.
  • how : par défaut,'any'si une donnée dans une ligne (ou colonne) contient NA, la ligne entière est supprimée ; s'il est défini surhow='all', la ligne entière n'est supprimée que lorsque toutes les valeurs d'une ligne (ou colonne) sont NA.
  • thresh : définir combien de valeurs non nulles sont nécessaires pour conserver les données.
  • subset : définir les colonnes que vous souhaitez vérifier. S'il y a plusieurs colonnes, vous pouvez utiliser une liste de noms de colonnes comme paramètre.
  • inplace : s'il est défini sur True, écrase directement la valeur précédente avec la valeur calculée et renvoie None, ce qui modifie les données source.

Nous pouvons utiliser la méthodeisnull()pour déterminer si chaque cellule est vide.

Exemple

import pandas as pd

df = pd.read_csv('property-data.csv')

print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Dans l'exemple ci-dessus, nous voyons que Pandas traite n/a et NA comme des données nulles, tandis que na n'est pas une donnée nulle et ne répond pas à notre exigence. Nous pouvons spécifier le type de données nulles :

Exemple

import pandas as pd

missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)

print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

L'exemple suivant montre comment supprimer des lignes contenant des données nulles.

Exemple

import pandas as pd

df = pd.read_csv('property-data.csv')

new_df = df.dropna()

print(new_df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Remarque :Par défaut, la méthode dropna() renvoie un nouveau DataFrame et ne modifie pas les données source.

Si vous souhaitez modifier le DataFrame source, vous pouvez utiliser leinplace = Trueparamètre :

Exemple

import pandas as pd

df = pd.read_csv('property-data.csv')

df.dropna(inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Nous pouvons également supprimer les lignes où une colonne spécifiée contient des valeurs nulles :

Exemple

Supprimer les lignes où la valeur du champ dans la colonne ST_NUM est vide :

import pandas as pd

df = pd.read_csv('property-data.csv')

df.dropna(subset=['ST_NUM'], inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Nous pouvons également utiliser la méthodefillna()pour remplacer certains champs vides :

Exemple

Utilisez 12345 pour remplacer les champs vides :

import pandas as pd

df = pd.read_csv('property-data.csv')

df.fillna(12345, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Nous pouvons également spécifier une colonne particulière pour remplacer les données :

Exemple

Utilisez 12345 pour remplacer les données nulles dans PID :

import pandas as pd

df = pd.read_csv('property-data.csv')

df['PID'].fillna(12345, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

Une méthode courante pour remplacer les cellules vides consiste à calculer la moyenne, la médiane ou le mode de la colonne.

Pandas utilise les méthodesmean(),、median()etmode()pour calculer la moyenne (la moyenne de toutes les valeurs), la médiane (la valeur centrale après tri) et le mode (la valeur la plus fréquente) d'une colonne.

Exemple

Utilisez la méthode mean() pour calculer la moyenne de la colonne et remplacer les cellules vides :

import pandas as pd

df = pd.read_csv('property-data.csv')

x = df["ST_NUM"].mean()

df["ST_NUM"].fillna(x, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant ; l'encadré rouge correspond à la moyenne calculée qui a remplacé les cellules vides :

Exemple

Utilisez la méthode median() pour calculer la médiane de la colonne et remplacer les cellules vides :

import pandas as pd

df = pd.read_csv('property-data.csv')

x = df["ST_NUM"].median()

df["ST_NUM"].fillna(x, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant ; l'encadré rouge correspond à la médiane calculée qui a remplacé les cellules vides :

Exemple

Utilisez la méthode mode() pour calculer le mode de la colonne et remplacer les cellules vides :

import pandas as pd

df = pd.read_csv('property-data.csv')

x = df["ST_NUM"].mode()

df["ST_NUM"].fillna(x, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant ; l'encadré rouge correspond au mode calculé qui a remplacé les cellules vides :


Nettoyage avec Pandas des données mal formatées

Les cellules avec des formats de données incorrects rendent l'analyse des données difficile, voire impossible.

Nous pouvons traiter les lignes contenant des cellules vides, ou convertir toutes les cellules d'une colonne en données au même format.

L'exemple suivant formate la date :

Exemple

import pandas as pd

# La troisième date a un format incorrect
data = {
  "Date": ['2020/12/01', '2020/12/02' , '20201226'],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

df['Date'] = pd.to_datetime(df['Date'], format='mixed')

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

           Date  duration
day1 2020-12-01        50
day2 2020-12-02        40
day3 2020-12-26        45

Nettoyage des données incorrectes avec Pandas

Les erreurs de données sont aussi une situation très courante. Nous pouvons remplacer ou supprimer les données incorrectes.

L'exemple suivant remplace les données par des âges incorrects :

Exemple

import pandas as pd

person = {
  "name": ['Google', 'Example' , 'Taobao'],
  "age": [50, 40, 12345]    # Les données d'âge 12345 sont incorrectes
}

df = pd.DataFrame(person)

df.loc[2, 'age'] = 30 # Modifier les données

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

     name  age
0  Google   50
1  Example   40
2  Taobao   30

Vous pouvez également définir des instructions conditionnelles :

Exemple

Définir à 120 les âges supérieurs à 120 :

import pandas as pd

person = {
  "name": ['Google', 'Example' , 'Taobao'],
  "age": [50, 200, 12345]    
}

df = pd.DataFrame(person)

for x in df.index:
  if df.loc[x, "age"] > 120:
    df.loc[x, "age"] = 120

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

     name  age
0  Google   50
1  Example  120
2  Taobao  120

Vous pouvez également supprimer les lignes contenant des données incorrectes :

Exemple

Supprimer les lignes où l'âge est supérieur à 120 :

import pandas as pd

person = {
  "name": ['Google', 'Example' , 'Taobao'],
  "age": [50, 40, 12345]    # Les données d'âge 12345 sont incorrectes
}

df = pd.DataFrame(person)

for x in df.index:
  if df.loc[x, "age"] > 120:
    df.drop(x, inplace = True)

print(df.to_string())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

     name  age
0  Google   50
1  Example   40

Nettoyage des données en double avec Pandas

Si nous voulons nettoyer les données en double, nous pouvons utiliser la méthodeduplicated()etdrop_duplicates().

Si les données correspondantes sont en double,duplicated()renverra True, sinon il renverra False.

Exemple

import pandas as pd

person = {
  "name": ['Google', 'Example', 'Example', 'Taobao'],
  "age": [50, 40, 40, 23]  
}
df = pd.DataFrame(person)

print(df.duplicated())

Le résultat de sortie de l'exemple ci-dessus est le suivant :

0    False
1    False
2     True
3    False
dtype: bool

Pour supprimer les données en double, vous pouvez directement utiliser la méthodedrop_duplicates().

Exemple

import pandas as pd

persons = {
  "name": ['Google', 'Example', 'Example', 'Taobao'],
  "age": [50, 40, 40, 23]  
}

df = pd.DataFrame(persons)

df.drop_duplicates(inplace = True)
print(df)

Le résultat de sortie de l'exemple ci-dessus est le suivant :

     name  age
0  Google   50
1  Example   40
3  Taobao   23

Méthodes et descriptions courantes

Méthodes courantes de nettoyage et de prétraitement des données :

OpérationMéthode/ÉtapeDescriptionFonctions/Méthodes courantes
Gestion des valeurs manquantesRemplir les valeurs manquantesRemplir les valeurs manquantes avec une valeur spécifiée (telle que la moyenne, la médiane, le mode, etc.).df.fillna(value)
Supprimer les valeurs manquantesSupprimer les lignes ou colonnes contenant des valeurs manquantes.df.dropna()
Gestion des données dupliquéesSupprimer les données dupliquéesSupprimer les lignes dupliquées dans le DataFrame.df.drop_duplicates()
Gestion des valeurs aberrantesDétection des valeurs aberrantes (basée sur des méthodes statistiques)Identifier et traiter les valeurs aberrantes à l'aide de la méthode du score Z ou de l'IQR.Fonction personnalisée (par exemple basée sur le score Z ou l'IQR)
Remplacer les valeurs aberrantesRemplacer les valeurs aberrantes par des valeurs appropriées (telles que la moyenne ou la médiane).Fonction personnalisée (par exemple le remplacement des valeurs aberrantes)
Conversion de format de donnéesConvertir les types de donnéesConvertir un type de données d'un type à un autre, par exemple convertir une chaîne en date.df.astype()
Conversion de format de date/heureConvertir des chaînes ou des nombres en type datetime.pd.to_datetime()
Standardisation et normalisationNormalisationTransformer les données en une distribution avec une moyenne de 0 et un écart-type de 1.StandardScaler()
NormalisationMettre les données à l'échelle sur un intervalle spécifié (p. ex., [0, 1]).MinMaxScaler()
Encodage des données catégoriellesEncodage des étiquettesConvertir les variables catégorielles en forme entière.LabelEncoder()
Encodage one-hotConvertir chaque catégorie en une nouvelle caractéristique binaire.pd.get_dummies()
Traitement des données textuellesSupprimer les mots videsSupprimer les mots non significatifs du texte, tels que « the », « is », etc.Fonction personnalisée (basée surnltkouspaCy)
Racinisation et lemmatisationExtraire les racines ou restaurer la forme de base des mots.nltk.stem.PorterStemmer()
TokenisationDiviser le texte en mots ou sous-mots.nltk.word_tokenize()
Échantillonnage des donnéesÉchantillonnage aléatoireÉchantillonner aléatoirement une certaine proportion des données.df.sample()
Sur-échantillonnage et sous-échantillonnageÉquilibrer la distribution des classes dans le jeu de données par sur-échantillonnage (duplication des échantillons de la classe minoritaire) ou sous-échantillonnage (réduction des échantillons de la classe majoritaire).SMOTE()(Sur-échantillonnage);RandomUnderSampler()(Sous-échantillonnage)
Ingénierie des caractéristiquesSélection de caractéristiquesSélectionner les caractéristiques qui influencent la variable cible et supprimer les caractéristiques redondantes ou non pertinentes.SelectKBest()
Extraction de caractéristiquesCréer de nouvelles caractéristiques à partir des données brutes pour améliorer le pouvoir prédictif du modèle.PolynomialFeatures()
Mise à l'échelle des caractéristiquesMettre à l'échelle les caractéristiques numériques afin qu'elles aient la même magnitude.MinMaxScaler() 、 StandardScaler()
Mappage des caractéristiques catégoriellesMappage des caractéristiquesAssocier les variables catégorielles aux codes numériques correspondants.Fonction de mappage personnalisée
Fusion et concaténation de donnéesFusionner des donnéesFusionner plusieurs DataFrames en fonction de certaines colonnes, en prenant en charge les jointures inner, outer, left, right, etc.pd.merge()
Concaténer des donnéesConcaténer plusieurs DataFrames par lignes ou par colonnes.pd.concat()
Remodelage des donnéesTableau croisé dynamiqueRegrouper les données selon certaines dimensions et calculer des résultats agrégés.pd.pivot_table()
Transformation des donnéesModifier la forme des données, par exemple du format long au format large ou du format large au format long.df.melt() 、 df.pivot()
Conversion et traitement des types de donnéesTraitement des chaînes de caractèresTraiter les données de type chaîne de caractères, comme supprimer les espaces, convertir la casse, etc.str.replace() 、 str.upper()wait
Calcul groupéEffectuer une agrégation après regroupement selon une caractéristique donnée.df.groupby()
Remplissage prédictif des valeurs manquantesUtiliser des modèles pour prédire et remplir les valeurs manquantesUtiliser des modèles d'apprentissage automatique (par exemple, des modèles de régression) pour prédire les valeurs manquantes et remplir les données manquantes.Modèle personnalisé (par exemple,sklearn.linear_model.LinearRegression)
Traitement des séries temporellesRemplissage des valeurs manquantes dans les séries temporellesUtiliser des méthodes de séries temporelles (telles que le remplissage avant, le remplissage arrière) pour remplir les valeurs manquantes.df.fillna(method='ffill')
Calcul de fenêtre glissanteUtiliser une fenêtre glissante pour effectuer des calculs statistiques sur les données de séries temporelles (par exemple, moyenne, écart-type, etc.).df.rolling(window=5).mean()
Conversion et mappage de donnéesMappage et remplacement de donnéesRemplacer certaines valeurs dans les données par d'autres valeurs.df.replace()

Remplir les valeurs manquantes :

Exemple

import pandas as pd

# Données d'exemple
données = {'Name': ['Alice', 'Bob', 'Charlie', None],
        'Age': [25, 30, None, 35],
        'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']}

df = pd.DataFrame(data)

# Remplir les valeurs manquantes de "Age" par la moyenne
df['Age'].fillna(df['Age'].mean(), inplace=True)

print(df)

Sortie :

      Name  Age           City
0    Alice   25.0       New York
1      Bob   30.0    Los Angeles
2  Charlie   30.0        Chicago
3     None   35.0        Houston

Encodage one-hot:

Exemple

import pandas as pd

# Données d'exemple
data = {'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']}

df = pd.DataFrame(data)

# Effectuer un encodage one-hot sur la colonne "City"
df_encoded = pd.get_dummies(df, columns=['City'])

print(df_encoded)

Sortie :

   City_Chicago  City_Houston  City_Los Angeles  City_New York
0             0             0                 0              1
1             0             0                 1              0
2             1             0                 0              0
3             0             1                 0              0

Standardisation:

Exemple

from sklearn.preprocessing import StandardScaler
import pandas as pd

# Données d'exemple
data = {'Age': [25, 30, 35, 40, 45],
        'Salary': [50000, 60000, 70000, 80000, 90000]}

df = pd.DataFrame(data)

# Standardiser les données
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

print(df_scaled)

Sortie :

[[-1.41421356 -1.41421356]
 [-0.70710678 -0.70710678]
 [ 0.          0.        ]
 [ 0.70710678  0.70710678]
 [ 1.41421356  1.41421356]]
Autres extensions