# Einführung
Wenn Sie gerade erst mit der Datenanalyse beginnen, lernen Sie als Erstes, wie Sie einen Datensatz bereinigen. Es klingt einfach, ist aber eine der wichtigsten Fähigkeiten, die Sie immer wieder anwenden werden.
Das Lustige daran ist, dass Sie selbst als Profi immer noch viel Zeit damit verbringen, Daten zu bereinigen, anstatt sie zu analysieren, Modelle zu erstellen oder Ergebnisse auszuwerten. Warum? Denn Rohdaten sind selten sauber. Es kann fehlende Werte, falsche Formate, doppelte Zeilen, unordentliche Zeichenfolgen, ungültige Datumsangaben, seltsame Kategorien und verrauschte Einträge enthalten.
Bevor Sie verstehen können, was die Daten Ihnen sagen, müssen Sie diese Probleme beheben.
In dieser Anleitung bereinigen wir eine unordentliche CSV-Kundendatei mit Python Und Pandas. Wir beginnen mit dem Laden und Überprüfen der Daten, bereinigen dann die Spaltennamen, behandeln fehlende Werte, entfernen Duplikate, standardisieren Textual content, konvertieren Datentypen, validieren E-Mails und speichern die endgültige saubere CSV-Datei.
# 1. Laden der CSV
Der erste Schritt besteht darin, den unordentlichen Datensatz in Pandas zu laden.
import pandas as pd
df = pd.read_csv("messy_customers.csv", keep_default_na=False)
df
Wir verwenden eine CSV-Kundendatei, die häufig Probleme mit der Datenqualität aufweist. Wie Sie bereits sehen können, enthält die Datei unordentliche Spaltennamen, inkonsistente Textformatierungen, gemischte Datumsformate, fehlende Werte, doppelte Zeilen und als Textual content gespeicherte Zahlen.
# 2. Inspektion vor der Reinigung
Bevor wir mit der Bereinigung beginnen, müssen wir verstehen, was tatsächlich im Datensatz enthalten ist.
print("Form:", df.form)
print("nColumn names:")
print(df.columns.tolist())
print("nData sorts:")
print(df.dtypes)
print("nExact duplicate rows:", df.duplicated().sum())
Ausgabe:
Form: (10, 8)
Column names:
(' Buyer ID ', ' Full Identify ', 'AGE', ' E-mail Tackle ', 'Be part of Date', 'Metropolis', 'Membership', 'Whole Spend')
Information sorts:
Buyer ID object
Full Identify object
AGE object
E-mail Tackle object
Be part of Date object
Metropolis object
Membership object
Whole Spend object
dtype: object
Precise duplicate rows: 1
Dies gibt uns einen schnellen Überblick über den Datensatz, bevor wir Änderungen vornehmen.
Wir können sehen, dass der Datensatz 10 Zeilen und 8 Spalten hat. Die Spaltennamen sind chaotisch, da einige von ihnen zusätzliche Leerzeichen und inkonsistente Groß-/Kleinschreibung enthalten. Wir können auch sehen, dass jede Spalte als gespeichert wird objectwas normalerweise bedeutet, dass Pandas sie als Textual content behandelt.
Die Duplikatprüfung zeigt auch, dass es genau eine doppelte Zeile gibt. Es ist hilfreich, dies frühzeitig zu wissen, da doppelte Datensätze die endgültige Analyse beeinträchtigen können.
# 3. Bereinigen der Spaltennamen
Da wir nun wissen, dass die Spaltennamen chaotisch sind, bereinigen wir sie zunächst.
df.columns = (
df.columns
.str.strip()
.str.decrease()
.str.change(r"s+", "_", regex=True)
)
df.columns.tolist()
Ausgabe:
('customer_id',
'full_name',
'age',
'email_address',
'join_date',
'metropolis',
'membership',
'total_spend')
Dieser Schritt entfernt zusätzliche Leerzeichen aus den Spaltennamen, wandelt alles in Kleinbuchstaben um und ersetzt Leerzeichen durch Unterstriche.
Jetzt ist es viel einfacher, mit den Spaltennamen zu arbeiten. Anstatt Namen mit Leerzeichen wie E-Mail-Adresse zu schreiben, können wir einfach verwenden email_address. Dies macht den Code sauberer und hilft, kleine Fehler später zu vermeiden.
# 4. Ersetzen von Leerzeichenfolgen und Platzhaltern
Als Nächstes ersetzen wir leere Werte und allgemeine Platzhalter durch die richtigen fehlenden Werte.
df = df.change(r"^s*$", pd.NA, regex=True)
df = df.change(
("N/A", "n/a", "NA", "unknown", "not a date"),
pd.NA,
)
df.isna().sum()
Ausgabe:
customer_id 1
full_name 1
age 1
email_address 0
join_date 1
metropolis 2
membership 1
total_spend 1
dtype: int64
In realen CSV-Dateien werden fehlende Daten häufig auf unterschiedliche Weise angezeigt. Einige Zellen sind leer, andere verwenden N/Aund einige verwenden Werte wie unknown oder not a date.
Wir wandeln all diese in richtige fehlende Werte um, damit Pandas sie richtig erkennen können. Nach diesem Schritt ist es später einfacher, fehlende Werte zu zählen, auszufüllen oder zu entfernen.
# 5. Doppelte Zeilen entfernen
Jetzt entfernen wir exakt doppelte Zeilen aus dem Datensatz.
print("Rows earlier than:", len(df))
df = df.drop_duplicates().copy()
print("Rows after:", len(df))
Ausgabe:
Rows earlier than: 10
Rows after: 9
Doppelte Zeilen können bei Ihrer Analyse zu Problemen führen, da derselbe Datensatz möglicherweise mehr als einmal gezählt wird.
Hier hatten wir 10 Zeilen vor dem Entfernen von Duplikaten und 9 Zeilen danach. Dies bedeutet, dass eine exakt doppelte Zeile aus dem Datensatz entfernt wurde.
# 6. Textspalten bereinigen
Jetzt bereinigen wir die textbasierten Spalten, damit die Werte konsistenter sind.
text_columns = ("customer_id", "full_name", "email_address", "metropolis", "membership")
for column in text_columns:
df(column) = df(column).astype("string").str.strip()
df("full_name") = (
df("full_name")
.str.change(r"s+", " ", regex=True)
.str.title()
)
df("metropolis") = df("metropolis").str.title()
df("membership") = df("membership").str.decrease()
df("email_address") = df("email_address").str.decrease()
df(text_columns)
Textspalten erfordern normalerweise eine zusätzliche Reinigung, da Menschen dieselbe Artwork von Informationen auf unterschiedliche Weise schreiben.
In diesem Schritt entfernen wir zusätzliche Leerzeichen aus customer_id, full_name, email_address, metropolisUnd membership. Anschließend bereinigen wir die Formatierung, sodass Namen und Städte die Groß- und Kleinschreibung des Titels verwenden, während E-Mails und Mitgliedschaftswerte Kleinbuchstaben verwenden.
Dies erleichtert das Lesen des Datensatzes und hilft uns auch, spätere Kategorieprobleme zu vermeiden. Zum Beispiel, Gold, GOLDUnd gold sollten alle als der gleiche Mitgliedschaftswert behandelt werden.
# 7. Kategorien standardisieren
Jetzt werden wir das reinigen membership Spalte, sodass sie nur gültige Kategorien enthält.
allowed_memberships = {"bronze", "silver", "gold"}
df.loc(~df("membership").isin(allowed_memberships), "membership") = pd.NA
df("membership").value_counts(dropna=False)
Ausgabe:
membership
gold 4
silver 2
2
bronze 1
Identify: rely, dtype: Int64
Dieser Schritt stellt sicher, dass die membership Die Spalte enthält nur die von uns erwarteten Werte.
In diesem Datensatz sind die gültigen Mitgliedschaftstypen: bronze, silverUnd gold. Jeder Wert außerhalb dieser Kategorien, wie z platinumwird durch einen fehlenden Wert ersetzt, damit wir ihn später bearbeiten können.
# 8. Alter in eine Zahl umrechnen
Als nächstes konvertieren wir die age Spalte von Textual content zu Zahlen.
df("age") = pd.to_numeric(df("age"), errors="coerce")
df.loc(~df("age").between(0, 120), "age") = pd.NA
df("age") = df("age").astype("Int64")
df(("full_name", "age"))
Der age Die Spalte wurde als Textual content gespeichert, daher müssen wir sie in eine numerische Spalte konvertieren, bevor wir sie für die Analyse verwenden können.
Wir entfernen auch Werte, die keinen Sinn ergeben, wie etwa unfavourable Altersangaben oder Altersangaben über 120. Jedes ungültige Alter wird in einen fehlenden Wert umgewandelt, den wir später beheben werden.
# 9. Konvertieren gemischter Datumsformate
Jetzt werden wir das reinigen join_date Spalte.
df("join_date") = pd.to_datetime(
df("join_date"),
format="combined",
dayfirst=True,
errors="coerce",
)
df(("full_name", "join_date"))
Datumsangaben sind in CSV-Dateien oft unübersichtlich, da sie in verschiedenen Formaten angezeigt werden können.
Dieser Schritt konvertiert die join_date Spalte in eine richtige Datetime-Spalte umwandeln. Wir verwenden "combined" weil die Datumsangaben in dieser Datei nicht alle dem gleichen Format folgen. Jedes ungültige Datum wird in einen fehlenden Wert umgewandelt.
# 10. Bereinigen von Währungswerten
Als nächstes reinigen wir das total_spend Spalte.
df("total_spend") = (
df("total_spend")
.astype("string")
.str.change(r"(^0-9.-)", "", regex=True)
)
df("total_spend") = pd.to_numeric(df("total_spend"), errors="coerce")
df(("full_name", "total_spend"))
Der total_spend Die Spalte enthält Währungssymbole, Kommas und Textwerte, sodass Pandas sie noch nicht als Zahl behandeln kann.
Dieser Schritt entfernt alles außer Zahlen, Dezimalpunkten und Minuszeichen. Anschließend wandeln wir die Spalte in einen numerischen Wert um, damit wir Summen, Durchschnittswerte und andere nützliche Messwerte berechnen können.
# 11. E-Mail-Adressen validieren
Nun prüfen wir, ob die E-Mail-Adressen ein gültiges Format haben.
email_pattern = r"^(^s@)+@(^s@)+.(^s@)+$"
valid_email = df("email_address").str.match(email_pattern, na=False)
df.loc(~valid_email, "email_address") = pd.NA
df(("full_name", "email_address"))
Dies ist ein einfacher E-Mail-Validierungsschritt.
Es prüft, ob jede E-Mail die Grundstruktur einer E-Mail-Adresse aufweist. Wenn eine E-Mail eindeutig ungültig ist, ersetzen wir sie durch einen fehlenden Wert. Dies trägt dazu bei, dass die email_address Säulenreiniger und zuverlässiger.
# 12. Umgang mit fehlenden Werten
Jetzt werden wir entscheiden, was mit den verbleibenden fehlenden Werten geschehen soll.
df = df.dropna(subset=("customer_id")).copy()
df("full_name") = df("full_name").fillna("Unknown")
df("metropolis") = df("metropolis").fillna("Unknown")
df("membership") = df("membership").fillna("unassigned")
median_age = int(df("age").median())
df("age") = df("age").fillna(median_age)
df("total_spend") = df("total_spend").fillna(0.0)
print("Median age used:", median_age)
df.isna().sum()
Ausgabe:
Median age used: 31
customer_id 0
full_name 0
age 0
email_address 1
join_date 1
metropolis 0
membership 0
total_spend 0
dtype: int64
Für diesen Datensatz entfernen wir Zeilen, in denen customer_id fehlt, da es sich um die Hauptkennung für jeden Kunden handelt.
Für die anderen Spalten verwenden wir sinnvolle Ersetzungen. Es fehlen Namen und Städte Unknownfehlende Mitgliedschaftswerte werden unassignedfehlende Altersangaben werden mit dem Medianalter und fehlende Ausgabenwerte mit aufgefüllt 0.0.
Wir haben immer noch fehlende Werte in email_address Und join_dateund das ist in Ordnung. Manchmal ist es besser, fehlende Werte beizubehalten, anstatt einen Wert zu erzwingen, der möglicherweise nicht korrekt ist.
# 13. Überprüfung der bereinigten Daten
Bevor wir die endgültige Datei speichern, sollten wir überprüfen, ob der bereinigte Datensatz den von uns erwarteten Regeln entspricht.
final_memberships = {"bronze", "silver", "gold", "unassigned"}
assert df("customer_id").notna().all()
assert df("customer_id").is_unique
assert df("age").between(0, 120).all()
assert df("total_spend").ge(0).all()
assert df("membership").isin(final_memberships).all()
print("All validation checks handed.")
Ausgabe:
All validation checks handed.
Mithilfe dieser Überprüfungen können wir bestätigen, dass die wichtigen Reinigungsschritte erfolgreich waren.
Wir prüfen, ob jeder Kunde eine ID hat, dass die Kunden-IDs eindeutig sind, dass das Alter gültig ist, dass die Gesamtausgaben nicht negativ sind und dass die Mitgliedschaftswerte nur aus der endgültig genehmigten Liste stammen. Wenn alle Prüfungen erfolgreich sind, können wir uns bei der Verwendung dieses bereinigten Datensatzes sicherer fühlen.
# 14. Überprüfung des Endergebnisses
Jetzt können wir den bereinigten Datensatz überprüfen und sicherstellen, dass alles korrekt aussieht.
Zu diesem Zeitpunkt sind die Daten viel sauberer als zuvor.
Die Spaltennamen sind konsistent, die Textwerte wurden bereinigt, die Altersspalte ist jetzt numerisch, das Beitrittsdatum hat ein korrektes Datumsformat und die Spalte „Gesamtausgaben“ ist für Berechnungen bereit.
Diese abschließende Überprüfung ist wichtig, da sie uns eine letzte Likelihood gibt, offensichtliche Probleme schnell zu erkennen, bevor wir die bereinigte Datei speichern.
# 15. Speichern der sauberen CSV-Datei
Abschließend speichern wir den bereinigten Datensatz als neue CSV-Datei.
df.to_csv(
"clean_customers.csv",
index=False,
date_format="%Y-%m-%d",
)
print("Saved clear file to clean_customers.csv")
Ausgabe:
Saved clear file to clean_customers.csv
Wir speichern den bereinigten Datensatz als separate Datei, sodass die ursprüngliche unordentliche CSV-Datei unverändert bleibt.
Dies ist eine gute Vorgehensweise, da Sie jederzeit zur Rohdatei zurückkehren können, wenn etwas schief geht oder Sie später einen anderen Reinigungsansatz anwenden möchten.
# Letzte Gedanken
Die meisten Leute denken, sie wüssten, wie man einen Datensatz bereinigt, aber die eigentliche Herausforderung beginnt, wenn man sicherstellen muss, dass die Daten tatsächlich für die Analyse bereit sind.
Es geht nicht nur darum, fehlende Werte zu entfernen oder Spaltennamen zu korrigieren. Sie müssen außerdem Datentypen überprüfen, ungültige Werte behandeln, Duplikate entfernen, Kategorien standardisieren, wichtige Felder validieren und abschließende Prüfungen durchführen, bevor Sie dem Datensatz vertrauen.
Hier machen viele Anfänger Fehler. Sie bereinigen die Daten an der Oberfläche, validieren jedoch nicht, ob der endgültige Datensatz sinnvoll ist.
In diesem Leitfaden haben wir einen einfachen, aber praktischen Arbeitsablauf zum Bereinigen einer unordentlichen CSV-Datei mit Python und Pandas befolgt. Wir haben die Daten geladen, sie überprüft, die Spalten bereinigt, fehlende Werte bearbeitet, Textual content korrigiert, Zahlen und Daten konvertiert, E-Mails validiert, das Endergebnis überprüft und eine saubere CSV-Datei gespeichert.
Dies ist die Artwork von Workflow, die Sie in quick jedem realen Datenprojekt wiederverwenden können. Der Datensatz kann sich ändern, aber der Prozess bleibt größtenteils derselbe: prüfen, bereinigen, validieren und speichern.
Abid Ali Awan (@1abidaliawan) ist ein zertifizierter Datenwissenschaftler, der gerne Modelle für maschinelles Lernen erstellt. Derzeit konzentriert er sich auf die Erstellung von Inhalten und das Schreiben technischer Blogs zu maschinellem Lernen und Datenwissenschaftstechnologien. Abid verfügt über einen Grasp-Abschluss in Technologiemanagement und einen Bachelor-Abschluss in Telekommunikationstechnik. Seine Imaginative and prescient ist es, ein KI-Produkt mithilfe eines graphischen neuronalen Netzwerks für Schüler mit psychischen Erkrankungen zu entwickeln.
