Recherche de site Web

10 One-Liners Python utiles pour le nettoyage des données


Voici quelques lignes directrices Python utiles pour les tâches courantes de nettoyage de données.

Lorsque vous travaillez avec un ensemble de données, vous devez le nettoyer pour disposer de données que vous pourrez analyser davantage. Les problèmes courants de qualité des données incluent les doublons, les formats incorrects, les valeurs hors plage et les entrées manquantes.

Ce didacticiel passe en revue les one-liners Python que vous pouvez utiliser pour les tâches courantes de nettoyage de données. Nous travaillerons avec un exemple d’ensemble de données.

Pour suivre confortablement, vous devez être à l'aise avec la compréhension de listes et de dictionnaires en Python. Commençons.

Génération d'exemples de données

▶️ Voici le notebook Google Colab pour ce tutoriel.

Nous allons d’abord générer des exemples de données :

data = [
	{"name": "alice smith", "age": 30, "email": "alice@example.com", "salary": 50000.00, "join_date": "2022-03-15"},
	{"name": "bob gray", "age": 17, "email": "bob@not-an-email", "salary": 60000.00, "join_date": "invalid-date"},
	{"name": "charlie brown", "age": None, "email": "charlie@example.com", "salary": -1500.00, "join_date": "15-09-2022"},
	{"name": "dave davis", "age": 45, "email": "dave@example.com", "salary": 70000.00, "join_date": "2021-07-01"},
	{"name": "eve green", "age": 25, "email": "eve@example.com", "salary": None, "join_date": "2023-12-31"},
]

Essayons maintenant d'écrire du code pour résoudre les problèmes dans les exemples de données avec lesquels nous travaillons.

1. Mettre les chaînes en majuscule

Il est important de maintenir la cohérence des formats de chaînes dans tout l’ensemble de données. Mettons en majuscule les chaînes de nom comme indiqué :

# Capitalizing the names for consistency
data = [{**d, "name": d["name"].title()} for d in data]

2. Convertir les types de données

Il est nécessaire de garantir que les types de données sont cohérents et corrects dans l’ensemble de données pour une analyse précise. Dans les exemples de données, convertissons les âges en nombres entiers, le cas échéant :

# Converting age to an integer type, defaulting to 25 if conversion fails
data = [{**d, "age": int(d["age"]) if isinstance(d["age"], (int, float)) else 25} for d in data]

3. Valider les plages numériques

Il est également important de s’assurer que les valeurs numériques se situent dans des plages acceptables. Vérifions que les âges sont compris entre 18 et 60 ans, en attribuant une valeur par défaut s'ils ne le sont pas :

# Ensuring age is an integer within the range of 18 to 60; otherwise, set to 25
data = [{**d, "age": d["age"] if isinstance(d["age"], int) and 18 <= d["age"] <= 60 else 25} for d in data]

4. Valider l'e-mail

Les incohérences de formatage sont assez courantes lorsque vous travaillez avec des champs de texte. La ligne de code suivante vérifie que les adresses e-mail sont valides, en remplaçant celles non valides par une adresse par défaut :

# Verifying that the email contains both an "@" and a "."; 
#assigning 'invalid@example.com' if the format is incorrect
data = [{**d, "email": d["email"] if "@" in d["email"] and "." in d["email"] else "invalid@example.com"} for d in data]

5. Gérer les valeurs manquantes

Les valeurs manquantes constituent un autre problème courant dans la plupart des ensembles de données. Ici, nous vérifions et remplaçons toutes les valeurs de salaire manquantes par une valeur par défaut comme celle-ci :

# Assigning a default salary of 30,000 if the salary is missing
data = [{**d, "salary": d["salary"] if d["salary"] is not None else 30000.00} for d in data]

6. Standardiser les formats de date

Avec les dates et les heures, il est important de les avoir toutes dans le même format. Voici comment convertir différents formats de date en un seul format, en utilisant par défaut un espace réservé pour les entrées non valides :

from datetime import datetime

# Attempting to convert the date to a standardized format and defaulting to '2023-01-01' if invalid
data = [{**d, "join_date": (lambda x: (datetime.strptime(x, '%Y-%m-%d').date() if '-' in x and len(x) == 10 else datetime.strptime(x, '%d-%m-%Y').date()) if x and 'invalid-date' not in x else '2023-01-01')(d['join_date'])} for d in data]

Même si cela fonctionne, il peut être difficile à lire. Il serait peut-être préférable de diviser cela en plusieurs étapes. Lisez Pourquoi vous ne devriez pas abuser des compréhensions de liste en Python pour savoir pourquoi vous ne devriez pas utiliser les compréhensions au détriment de la lisibilité et de la maintenabilité.

7. Supprimer les valeurs négatives

Parfois, vous devrez peut-être vous assurer que certains champs numériques n'acceptent que des valeurs non négatives, telles que l'âge, le salaire, etc. Par exemple, vous pouvez remplacer toutes les valeurs de salaire négatives par zéro comme ceci :

# Replacing negative salary values with zero to ensure all values are non-negative
data = [{**d, "salary": max(d["salary"], 0)} for d in data]

8. Vérifiez les doublons

Il est important de supprimer les enregistrements en double avant de pouvoir analyser davantage l'ensemble de données. Assurons-nous qu'il ne reste que des enregistrements uniques en vérifiant les noms en double :

# Keeping only unique entries based on the name field
data = {tuple(d.items()) for d in data}  # Using a set to remove duplicates
data = [dict(t) for t in data]  # Converting back to list of dictionaries

9. Échelle des valeurs numériques

La mise à l'échelle des valeurs numériques peut parfois aider à une analyse cohérente. Utilisons une compréhension pour adapter les salaires à un pourcentage du salaire maximum dans l'ensemble de données :

# Normalizing salary values to a percentage of the maximum salary
max_salary = max(d["salary"] for d in data)
data = [{**d, "salary": (d["salary"] / max_salary * 100) if max_salary > 0 else 0} for d in data]

10. Couper les espaces

Vous devrez peut-être parfois supprimer les espaces inutiles des chaînes. Voici une ligne unique pour supprimer les espaces de début et de fin des chaînes de nom :

# Trimming whitespace from names for cleaner data
data = [{**d, "name": d["name"].strip()} for d in data]

Après avoir exécuté les étapes de nettoyage des données, le dictionnaire de données ressemble à ceci :

[{'name': 'Bob Gray',
  'age': 25,
  'email': 'invalid@example.com',
  'salary': 85.71428571428571,
  'join_date': '2023-01-01'},
 {'name': 'Alice Smith',
  'age': 30,
  'email': 'alice@example.com',
  'salary': 71.42857142857143,
  'join_date': datetime.date(2022, 3, 15)},
 {'name': 'Charlie Brown',
  'age': 25,
  'email': 'charlie@example.com',
  'salary': 0.0,
  'join_date': datetime.date(2022, 9, 21)},
 {'name': 'Dave Davis',
  'age': 45,
  'email': 'dave@example.com',
  'salary': 100.0,
  'join_date': datetime.date(2021, 7, 1)},
 {'name': 'Eve Green',
  'age': 25,
  'email': 'eve@example.com',
  'salary': 42.857142857142854,
  'join_date': datetime.date(2023, 12, 31)}]

Conclusion

Dans ce didacticiel, nous avons examiné les problèmes courants de qualité des données et les one-liners en Python pour nettoyer un exemple d'ensemble de données.

Ceux-ci peuvent s’avérer utiles lorsque vous devez effectuer un nettoyage simple et vous lancer directement dans l’analyse des données. Si vous recherchez un article similaire pour les pandas, lisez 10 Pandas One Liners pour l'accès, la manipulation et la gestion des données.

Bon nettoyage des données !

Articles connexes