Duplikate erkennen und entfernen
Finden Sie mit duplicated() und drop_duplicates() exakte und teilweise Duplikate und entscheiden Sie, welcher doppelte Datensatz erhalten bleiben soll.
Duplikate erkennen und entfernen ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Duplikate wichtig sind
Doppelte Zeilen erhöhen Zählungen, Umsatzsummen und Durchschnittswerte unbemerkt, ohne dass eine Fehlermeldung ausgegeben wird. Ein Verkaufsdatensatz mit 500 doppelten Bestelldatensätzen weist den Umsatz um genau die Summe dieser 500 Bestellungen zu hoch aus. Das Erkennen und Entfernen von Duplikaten gehört zu den ersten Bereinigungsschritten, die Sie vor jeder Aggregation oder Modellierung durchführen sollten, da sich nachgelagerte Fehler aus dieser einen Fehlerquelle fortlaufend verstärken.
import pandas as pd
df = pd.read_csv('orders.csv')
print('Shape before dedup:', df.shape)
print('Exact duplicates:', df.duplicated().sum())Exakte Duplikate finden
df.duplicated() gibt eine boolesche Series zurück, deren Wert für jede Zeile, die eine exakte Kopie einer vorherigen Zeile ist, True lautet. Die Standardeinstellung keep='first' markiert alle Vorkommen außer dem ersten. Mit keep=False wird jedes Vorkommen eines Duplikats markiert – nützlich, wenn Sie vor der Entscheidung, welches Vorkommen behalten werden soll, alle Kopien eines doppelten Datensatzes prüfen möchten.
# Mark only the second+ occurrences
partial_dups = df[df.duplicated(keep='first')]
print('Rows to remove:', len(partial_dups))
# Mark ALL copies of any duplicate
all_dups = df[df.duplicated(keep=False)]
print('Rows involved in duplicates:', len(all_dups))Exakte Duplikate entfernen
Entfernen Sie exakt doppelte Zeilen mit df.drop_duplicates(). Standardmäßig bleibt das erste Vorkommen erhalten, während alle weiteren entfernt werden. Übergeben Sie keep='last', um den neuesten Datensatz zu behalten, wenn Ihre Daten einen Zeitstempel enthalten und spätere Zeilen als maßgeblicher gelten. Prüfen Sie immer die Zeilenanzahl vor und nach dem Vorgang, um zu bestätigen, dass die erwartete Anzahl von Zeilen entfernt wurde.
df_clean = df.drop_duplicates(keep='first')
print('Rows removed:', len(df) - len(df_clean))
print('Shape after dedup:', df_clean.shape)Teilweise Duplikate: schlüsselbasiert
Zeilen können teilweise doppelt vorkommen: Sie haben denselben Geschäftsschlüssel (z. B. order_id), unterscheiden sich aber aufgrund eines vorgelagerten Fehlers, der zwei Versionen desselben Datensatzes erzeugt hat, in anderen Spalten. Verwenden Sie df.duplicated(subset=['order_id']), um Zeilen mit demselben Schlüssel, aber möglicherweise unterschiedlichen Werten in anderen Spalten zu finden. Prüfen Sie diese Zeilen, bevor Sie entscheiden, wie Sie sie abgleichen.
key_dups = df[df.duplicated(subset=['order_id'], keep=False)]
print('Orders with duplicate IDs:')
print(key_dups.sort_values('order_id').head(10))Welches Duplikat beibehalten werden soll
Wenn teilweise doppelte Datensätze vorhanden sind, müssen Sie entscheiden, welcher Datensatz maßgeblich ist. Gängige Strategien sind: die Zeile mit dem aktuellsten Zeitstempel (also der letzten Aktualisierung) beibehalten, die Zeile mit den meisten Nicht-Null-Werten beibehalten oder bei Korrekturen den Datensatz mit dem höheren Geldbetrag behalten. Sortieren Sie nach Ihrem Kriterium zur Auflösung von Gleichständen und entfernen Sie anschließend die Duplikate, wobei Sie das erste (oder letzte) Vorkommen beibehalten.
# Keep the record with the latest update timestamp
df_sorted = df.sort_values('updated_at', ascending=False)
df_dedup = df_sorted.drop_duplicates(subset=['order_id'], keep='first')
print('Kept:', len(df_dedup), 'unique orders')Erkennen nahezu identischer Datensätze
Nahezu identische Datensätze sind Zeilen, die dieselbe Entität darstellen, sich aber geringfügig unterscheiden – etwa derselbe Kundenname mit einem Tippfehler oder dieselbe Transaktion mit einer Rundungsdifferenz von einem Cent. Die Erkennung exakter Duplikate findet solche Fälle nicht. Ein Ansatz besteht darin, nach der Schlüsselspalte zu gruppieren und zu zählen: Wenn ein Kundenname in leicht unterschiedlichen Varianten vorkommt, verwenden Sie vor dem Entfernen von Duplikaten .str.strip().str.lower(), um die Werte zu normalisieren.
df['customer_normalized'] = df['customer_name'].str.strip().str.lower()
near_dups = df.groupby('customer_normalized').size().sort_values(ascending=False)
print(near_dups[near_dups > 1].head())Duplikate mit GroupBy-Aggregation bereinigen
Wenn Sie doppelte Zeilen zusammenführen müssen, statt sie einfach zu entfernen, verwenden Sie groupby().agg(). Stellen Sie sich beispielsweise vor, dass zwei Zeilen dieselbe Bestellung darstellen, eine aber die Lieferadresse und die andere die Rechnungsadresse enthält. Sie können mit 'first' aggregieren (wobei Nicht-Null-Werte bevorzugt werden) oder eine benutzerdefinierte Funktion verwenden, die Nicht-Null-Werte über die Duplikate hinweg zusammenführt.
def coalesce(*args):
for a in args:
if pd.notna(a):
return a
return None
df_merged = df.groupby('order_id').agg(
customer=('customer_name', 'first'),
amount=('amount', 'max'),
date=('order_date', 'min')
).reset_index()
print(df_merged.head())Prüfen, ob die Zeilenreihenfolge eine Rolle spielt
Das Ergebnis von drop_duplicates(keep='first') hängt von der Reihenfolge der Zeilen ab. Wenn der DataFrame aus einer Datenbankabfrage ohne ORDER-BY-Klausel geladen wurde, ist die Reihenfolge der Zeilen nicht deterministisch. Das bedeutet, dass je nach Ausführung ein anderer Datensatz beibehalten werden kann. Sortieren Sie vor dem Entfernen von Duplikaten immer nach einem stabilen Schlüssel (z. B. Primärschlüssel oder Zeitstempel), damit der Prozess deterministisch und reproduzierbar ist.
# Sort by primary key before deduplication for deterministic results
df = df.sort_values('order_id').reset_index(drop=True)
df_clean = df.drop_duplicates(subset=['order_id'], keep='first')
print('Deterministic dedup complete.')Ergebnis der Duplikatbereinigung überprüfen
Überprüfen Sie das Ergebnis nach dem Entfernen der Duplikate mit drei Prüfungen: Es dürfen keine exakten Duplikate übrig sein (df_clean.duplicated().sum() == 0), es darf keine doppelten Geschäftsschlüssel geben (df_clean.duplicated(subset=['order_id']).sum() == 0) und die erwartete Zeilenanzahl muss plausibel sein. Formulieren Sie diese Prüfungen als Assertions, damit sie deutlich fehlschlagen, wenn zukünftige Datenänderungen die Bereinigungslogik ungültig machen.
assert df_clean.duplicated().sum() == 0, 'Exact duplicates remain'
assert df_clean.duplicated(subset=['order_id']).sum() == 0, 'Duplicate order IDs remain'
print('Deduplication verified. Rows:', len(df_clean))Entfernte Duplikate dokumentieren
Eine gute Datenbereinigung ist reproduzierbar und prüfbar. Protokollieren Sie die Anzahl der entfernten Zeilen, den Schlüssel für die Duplikaterkennung und die Regel zur Auflösung von Gleichständen in einem Dictionary für den Bereinigungsbericht. Speichern Sie diesen Bericht zusammen mit der bereinigten Datendatei, damit alle Personen, die die Pipeline später ausführen, die Bereinigungsentscheidungen überprüfen können, ohne den Code erneut lesen zu müssen. Transparenz bei der Datenbereinigung schafft Vertrauen in die Analyseergebnisse.
cleaning_log = {
'original_rows': len(df),
'dedup_key': 'order_id',
'tiebreak': 'keep first by updated_at desc',
'rows_removed': len(df) - len(df_clean),
'clean_rows': len(df_clean)
}
for k, v in cleaning_log.items():
print(f'{k}: {v}')Bereinigten Datensatz speichern
Speichern Sie den DataFrame ohne Duplikate in einer neuen Datei, statt die Originaldatei zu überschreiben. So bleiben die Rohdaten für Prüfungen erhalten. Benennen Sie die Datei eindeutig mit dem Suffix _clean oder _deduped und fügen Sie das Ausführungsdatum hinzu, damit mehrere Bereinigungsläufe unterscheidbar sind. Verwenden Sie Parquet, um die Daten in nachfolgenden Pipelineschritten schnell erneut zu laden.
from datetime import date
output_path = f'orders_clean_{date.today()}.parquet'
df_clean.to_parquet(output_path, index=False)
print(f'Saved {len(df_clean)} rows to {output_path}')Schnelltest
Testen Sie Ihr Verständnis der Konzepte zur Datenanalyse aus dieser Lektion.
Lektionszusammenfassung
In dieser Lektion haben Sie Folgendes gelernt: exakte und teilweise doppelte Datensätze mit duplicated() und drop_duplicates() erkennen, mithilfe von Sortier- und Aggregationsstrategien entscheiden, welches Duplikat beibehalten wird und Ergebnisse mit Assertions überprüfen sowie Bereinigungsentscheidungen protokollieren. Als Nächstes sehen wir uns Techniken zur Erkennung und Behandlung von Ausreißern an.
Häufig gestellte Fragen
Ist die Lektion „Duplikate erkennen und entfernen“ kostenlos?
Ja — der vollständige Text von „Duplikate erkennen und entfernen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Duplikate erkennen und entfernen“?
Finden Sie mit duplicated() und drop_duplicates() exakte und teilweise Duplikate und entscheiden Sie, welcher doppelte Datensatz erhalten bleiben soll. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?
Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Duplikate erkennen und entfernen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?
Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Duplikate erkennen und entfernen
- Ausreißer erkennen und behandeln
- Inkonsistente Kategorien standardisieren
- Schemas validieren und Assertions