7 Schritte zur Beherrschung der Datenbereinigung mit Python und Pandas
Möchten Sie die Datenbereinigung mit Pandas lernen? In diesem Tutorial erfahren Sie alles, was Sie wissen müssen.
Pandas ist die am weitesten verbreitete Python-Bibliothek zur Datenanalyse und -manipulation. Doch die Daten, die Sie aus der Quelle lesen, erfordern oft eine Reihe von Datenbereinigungsschritten – bevor Sie sie analysieren können, um Erkenntnisse zu gewinnen, Geschäftsfragen zu beantworten oder Modelle für maschinelles Lernen zu erstellen.
Dieser Leitfaden unterteilt den Prozess der Datenbereinigung mit Pandas in 7 praktische Schritte. Wir erstellen einen Beispieldatensatz und arbeiten die Schritte zur Datenbereinigung durch.
Fangen wir an!
Erstellen eines Beispieldatenrahmens
Link zum Colab Notebook
Bevor wir mit den eigentlichen Datenbereinigungsschritten beginnen, erstellen wir einen Pandas-Datenrahmen mit Mitarbeiterdatensätzen. Wir werden Faker für die Generierung synthetischer Daten verwenden. Installieren Sie es also zuerst:
!pip install Faker
Wenn Sie möchten, können Sie dem gleichen Beispiel folgen. Sie können auch einen Datensatz Ihrer Wahl verwenden. Hier ist der Code zum Generieren von 1000 Datensätzen:
import pandas as pd
from faker import Faker
import random
# Initialize Faker to generate synthetic data
fake = Faker()
# Set seed for reproducibility
Faker.seed(42)
# Generate synthetic data
data = []
for _ in range(1000):
data.append({
'Name': fake.name(),
'Age': random.randint(18, 70),
'Email': fake.email(),
'Phone': fake.phone_number(),
'Address': fake.address(),
'Salary': random.randint(20000, 150000),
'Join_Date': fake.date_this_decade(),
'Employment_Status': random.choice(['Full-Time', 'Part-Time', 'Contract']),
'Department': random.choice(['IT', 'Engineering','Finance', 'HR', 'Marketing'])
})
Lassen Sie uns diesen Datenrahmen ein wenig optimieren, um fehlende Werte, doppelte Datensätze, Ausreißer und mehr einzuführen:
# Let's tweak the records a bit!
# Introduce missing values
for i in random.sample(range(len(data)), 50):
data[i]['Email'] = None
# Introduce duplicate records
data.extend(random.sample(data, 100))
# Introduce outliers
for i in random.sample(range(len(data)), 20):
data[i]['Salary'] = random.randint(200000, 500000)
Jetzt erstellen wir einen Datenrahmen mit diesen Datensätzen:
# Create dataframe
df = pd.DataFrame(data)
Beachten Sie, dass wir den Startwert für Faker und nicht für das Zufallsmodul festlegen. Es wird also eine gewisse Zufälligkeit in den von Ihnen generierten Datensätzen geben.
Schritt 1: Die Daten verstehen
Schritt 0 besteht immer darin, die Geschäftsfrage/das Geschäftsproblem zu verstehen, das Sie lösen möchten. Sobald Sie wissen, dass Sie mit den Daten arbeiten können, die Sie in Ihren Pandas-Datenrahmen eingelesen haben.
Bevor Sie jedoch sinnvolle Maßnahmen am Datensatz ergreifen können, ist es wichtig, sich zunächst einen allgemeinen Überblick über den Datensatz zu verschaffen. Dazu gehört das Abrufen einiger grundlegender Informationen zu den verschiedenen Feldern und der Gesamtzahl der Datensätze, das Überprüfen des Kopfes des Datenrahmens und Ähnliches.
Hier führen wir die Methode info()
auf dem Datenrahmen aus:
df.info()
Output >>>
RangeIndex: 1100 entries, 0 to 1099
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 1100 non-null object
1 Age 1100 non-null int64
2 Email 1047 non-null object
3 Phone 1100 non-null object
4 Address 1100 non-null object
5 Salary 1100 non-null int64
6 Join_Date 1100 non-null object
7 Employment_Status 1100 non-null object
8 Department 1100 non-null object
dtypes: int64(2), object(7)
memory usage: 77.5+ KB
Und überprüfen Sie den Kopf des Datenrahmens:
df.head()
Schritt 2: Umgang mit Duplikaten
Doppelte Datensätze sind ein häufiges Problem, das die Analyseergebnisse verzerrt. Daher sollten wir alle doppelten Datensätze identifizieren und entfernen, sodass wir nur mit den eindeutigen Datensätzen arbeiten.
So finden wir alle Duplikate im Datenrahmen und legen sie dann an Ort und Stelle ab:
# Check for duplicate rows
duplicates = df.duplicated().sum()
print("Number of duplicate rows:", duplicates)
# Removing duplicate rows
df.drop_duplicates(inplace=True)
Output >>>
Number of duplicate rows: 100
Schritt 3: Umgang mit fehlenden Daten
Fehlende Daten sind in vielen datenwissenschaftlichen Projekten ein häufiges Problem der Datenqualität. Wenn Sie einen kurzen Blick auf das Ergebnis der Methode info()
aus dem vorherigen Schritt werfen, sollten Sie feststellen, dass die Anzahl der Nicht-Null-Objekte nicht für alle Felder identisch ist und Werte fehlen in der E-Mail-Spalte. Wir werden trotzdem die genaue Zahl erfahren.
Um die Anzahl der fehlenden Werte in jeder Spalte zu ermitteln, können Sie Folgendes ausführen:
# Check for missing values
missing_values = df.isna().sum()
print("Missing Values:")
print(missing_values)
Output >>>
Missing Values:
Name 0
Age 0
Email 50
Phone 0
Address 0
Salary 0
Join_Date 0
Employment_Status 0
Department 0
dtype: int64
Wenn in einer oder mehreren numerischen Spalten Werte fehlen, können wir geeignete Imputationstechniken anwenden. Da aber das Feld „E-Mail“ fehlt, setzen wir die fehlenden E-Mails einfach wie folgt auf eine Platzhalter-E-Mail:
# Handling missing values by filling with a placeholder
df['Email'].fillna('unknown@example.com', inplace=True)
Schritt 4: Daten transformieren
Wenn Sie am Datensatz arbeiten, gibt es möglicherweise ein oder mehrere Felder, die nicht den erwarteten Datentyp haben. In unserem Beispieldatenrahmen muss das Feld „Join_Date“ in ein gültiges Datetime-Objekt umgewandelt werden:
# Convert 'Join_Date' to datetime
df['Join_Date'] = pd.to_datetime(df['Join_Date'])
print("Join_Date after conversion:")
print(df['Join_Date'].head())
Output >>>
Join_Date after conversion:
0 2023-07-12
1 2020-12-31
2 2024-05-09
3 2021-01-19
4 2023-10-04
Name: Join_Date, dtype: datetime64[ns]
Da wir das Beitrittsdatum haben, ist es tatsächlich hilfreicher, eine Spalte „Angestellte Jahre“ zu haben, wie gezeigt:
# Creating a new feature 'Years_Employed' based on 'Join_Date'
df['Years_Employed'] = pd.Timestamp.now().year - df['Join_Date'].dt.year
print("New feature 'Years_Employed':")
print(df[['Join_Date', 'Years_Employed']].head())
Output >>>
New feature 'Years_Employed':
Join_Date Years_Employed
0 2023-07-12 1
1 2020-12-31 4
2 2024-05-09 0
3 2021-01-19 3
4 2023-10-04 1
Schritt 5: Textdaten bereinigen
Es kommt recht häufig vor, dass Zeichenfolgenfelder mit inkonsistenter Formatierung oder ähnlichen Problemen konfrontiert werden. Das Bereinigen von Text kann so einfach sein wie das Anwenden einer Groß-/Kleinschreibung oder so schwierig wie das Schreiben eines komplexen regulären Ausdrucks, um die Zeichenfolge in das erforderliche Format zu bringen.
In dem Beispieldatenrahmen, den wir haben, sehen wir, dass die Spalte „Adresse“ viele „\n“-Zeichen enthält, die die Lesbarkeit beeinträchtigen. Ersetzen wir sie also durch Leerzeichen wie folgt:
# Clean address strings
df['Address'] = df['Address'].str.replace('\n', ' ', regex=False)
print("Address after text cleaning:")
print(df['Address'].head())
Output >>>
Address after text cleaning:
0 79402 Peterson Drives Apt. 511 Davisstad, PA 35172
1 55341 Amanda Gardens Apt. 764 Lake Mark, WI 07832
2 710 Eric Estate Carlsonfurt, MS 78605
3 809 Burns Creek Natashaport, IA 08093
4 8713 Caleb Brooks Apt. 930 Lake Crystalbury, CA...
Name: Address, dtype: object
Schritt 6: Umgang mit Ausreißern
Wenn Sie wieder nach oben scrollen, werden Sie feststellen, dass wir einige Werte in der Spalte „Gehalt“ extrem hoch eingestellt haben. Solche Ausreißer sollten ebenfalls identifiziert und angemessen behandelt werden, damit sie die Analyse nicht verzerren.
Oft möchten Sie berücksichtigen, was einen Datenpunkt zu einem Ausreißer macht (ob es sich um eine falsche Dateneingabe handelt oder ob es sich tatsächlich um gültige Werte und nicht um Ausreißer handelt). Anschließend können Sie entscheiden, wie Sie damit umgehen möchten: Datensätze mit Ausreißern löschen oder die Teilmenge der Zeilen mit Ausreißern abrufen und diese separat analysieren.
Lassen Sie uns den Z-Score verwenden und die Gehaltswerte ermitteln, die mehr als drei Standardabweichungen vom Mittelwert entfernt sind:
# Detecting outliers using z-score
z_scores = (df['Salary'] - df['Salary'].mean()) / df['Salary'].std()
outliers = df[abs(z_scores) > 3]
print("Outliers based on Salary:")
print(outliers[['Name', 'Salary']].head())
Output >>>
Outliers based on Salary:
Name Salary
16 Michael Powell 414854
131 Holly Jimenez 258727
240 Daniel Williams 371500
328 Walter Bishop 332554
352 Ashley Munoz 278539
Schritt 7: Daten zusammenführen
In den meisten Projekten sind die Daten, über die Sie verfügen, möglicherweise nicht die Daten, die Sie für die Analyse verwenden möchten. Sie müssen die relevantesten Felder zur Verwendung finden und auch Daten aus anderen Datenrahmen zusammenführen, um nützlichere Daten zu erhalten, die Sie für die Analyse verwenden können.
Erstellen Sie als schnelle Übung einen weiteren zugehörigen Datenrahmen und führen Sie ihn mit dem vorhandenen Datenrahmen in einer gemeinsamen Spalte zusammen, sodass die Zusammenführung sinnvoll ist. Das Zusammenführen in Pandas funktioniert sehr ähnlich wie Joins in SQL, daher empfehle ich Ihnen, dies als Übung auszuprobieren!
Zusammenfassung
Das ist alles für dieses Tutorial! Wir haben einen Beispieldatenrahmen mit Datensätzen erstellt und die verschiedenen Schritte zur Datenbereinigung durchgearbeitet. Hier finden Sie eine Übersicht über die Schritte: Verstehen der Daten, Umgang mit Duplikaten, fehlenden Werten, Transformieren von Daten, Bereinigen von Textdaten, Umgang mit Ausreißern und Zusammenführen von Daten.
Wenn Sie alles über das Daten-Wrangling mit Pandas erfahren möchten, schauen Sie sich „7 Schritte zur Beherrschung des Daten-Wranglings mit Pandas und Python“ an.