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.

Verwandte Artikel