HOWTO · Pandas

Finden Sie doppelte Zeilen in einem DataFrame mit Pandas

Erfahren Sie, wie Sie doppelte Zeilen in einem Pandas-DataFrame erkennen, alle oder ausgewählte Spalten vergleichen und festlegen, welche Vorkommen markiert werden.

Auf dieser Seite

Mit DataFrame.duplicated() lassen sich doppelte Zeilen in einem Pandas-DataFrame finden. Die Methode gibt eine boolesche Series zurück, die am Index des DataFrames ausgerichtet ist. Verwenden Sie diese Series als Maske, um die mit True markierten Zeilen auszuwählen. Standardmäßig bleibt das erste Vorkommen unmarkiert; spätere übereinstimmende Zeilen werden markiert. Sie können alle Spalten vergleichen oder bestimmte Vergleichsspalten auswählen und mit keep festlegen, welche Vorkommen markiert werden.

Die Prüfung auf doppelte Zeilen ist hilfreich, wenn Sie tabellarische Daten untersuchen oder bereinigen. Das Finden von Duplikaten löscht oder ändert keine Zeilen, sondern kennzeichnet sie lediglich. Prüfen Sie die ausgewählten Zeilen, bevor Sie entscheiden, ob Sie Datensätze entfernen möchten.

DataFrame.duplicated() zum Erkennen doppelter Zeilen verwenden

Die Methode akzeptiert subset und keep:

  • subset ist eine Spaltenbezeichnung oder eine Liste von Bezeichnungen, die verglichen werden sollen. Beim Standardwert None vergleicht Pandas alle Spalten.
  • keep="first" ist die Standardeinstellung. Die erste Zeile jeder übereinstimmenden Gruppe wird mit False markiert, die folgenden Zeilen mit True.
  • keep="last" lässt die letzte Zeile jeder Gruppe unmarkiert und markiert frühere Vorkommen mit True.
  • keep=False markiert mit True jede Zeile einer Gruppe, die mehr als eine übereinstimmende Zeile enthält.

Das Ergebnis ist eine Series mit Markierungen, kein DataFrame mit den doppelten Zeilen. Wenden Sie sie mit df[df.duplicated()] an, um die als Duplikate markierten Zeilen zu erhalten. Die Indexbezeichnungen des DataFrames bleiben im gefilterten Ergebnis erhalten, sodass sich jede Zeile den ursprünglichen Daten zuordnen lässt.

Einen DataFrame mit doppelten Zeilen erstellen

Dieses Beispiel enthält drei identische Mitarbeiterdatensätze für John in Austin an den Indizes 1, 3 und 4. Index 1 ist das erste Vorkommen; standardmäßig werden die Indizes 3 und 4 als Duplikate markiert. Eine weitere Zeile enthält denselben Namen und dasselbe Alter, aber eine andere Stadt. Die übrigen Datensätze veranschaulichen zusätzliche Vergleichsmöglichkeiten. Das Beispiel gibt die Standardmarkierungen sowie die Zeilen aus, die beim Vergleich aller Spalten oder einer beziehungsweise zweier Vergleichsspalten ausgewählt werden. Führen Sie das Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

employees = [
    ("Joe", 28, "Chicago"),
    ("John", 32, "Austin"),
    ("Melvin", 25, "Dallas"),
    ("John", 32, "Austin"),
    ("John", 32, "Austin"),
    ("John", 32, "Houston"),
    ("Melvin", 40, "Dehradun"),
    ("Hazel", 32, "Austin"),
]
df = pd.DataFrame(employees, columns=["Name", "Age", "City"])

print("Flags for all columns:")
print(df.duplicated().tolist())
print("\nDuplicate rows across all columns:")
print(df[df.duplicated()])
print("\nRows repeated by City:")
print(df[df.duplicated(subset="City")])
print("\nRows repeated by Name and Age:")
print(df[df.duplicated(subset=["Name", "Age"])])
print("\nAll rows in exact duplicate groups:")
print(df[df.duplicated(keep=False)])
Flags for all columns:
[False, False, False, True, True, False, False, False]

Duplicate rows across all columns:
   Name  Age    City
3  John   32  Austin
4  John   32  Austin

Rows repeated by City:
    Name  Age    City
3   John   32  Austin
4   John   32  Austin
7  Hazel   32  Austin

Rows repeated by Name and Age:
   Name  Age     City
3  John   32   Austin
4  John   32   Austin
5  John   32  Houston

All rows in exact duplicate groups:
   Name  Age    City
1  John   32  Austin
3  John   32  Austin
4  John   32  Austin

Doppelte Zeilen anhand aller oder ausgewählter Spalten auswählen

Wird df.duplicated() ohne subset aufgerufen, werden die Werte aller Spalten verglichen. Im Beispiel sind die drei Zeilen für John in Austin identisch. Daher bleibt Index 1 bei der Standardeinstellung unmarkiert, während die Indizes 3 und 4 markiert werden. Die Zeile für John in Houston ist kein Duplikat über alle Spalten, da sich die Stadt unterscheidet.

Verwenden Sie df.duplicated(subset="City"), wenn nur City für den Vergleich herangezogen werden soll. Da Austin in mehreren Zeilen vorkommt, markiert die Standardeinstellung jede Austin-Zeile nach dem ersten Vorkommen, auch wenn sich Name und Alter unterscheiden. Das ist eine Übereinstimmung nach Stadt und bedeutet nicht, dass die vollständigen Datensätze identisch sind. Mit einer Liste wie subset=["Name", "Age"] vergleichen Sie eine Kombination von Spalten. In diesen Daten gehören John in Austin und John in Houston zur selben Vergleichsgruppe, daher werden spätere Vorkommen dieser Gruppe markiert.

Um stattdessen das letzte Vorkommen beizubehalten, filtern Sie mit df[df.duplicated(keep="last")]. Mit df[df.duplicated(keep=False)] wählen Sie jede Zeile aus, die zu einer mehrfach vorkommenden Gruppe gehört. Wählen Sie die Einstellung danach aus, welche Datensätze Sie untersuchen möchten; die Methode selbst lässt den DataFrame unverändert.

Fazit

Verwenden Sie DataFrame.duplicated(), um Duplikate zu markieren, und wenden Sie anschließend die boolesche Series an, um Zeilen auszuwählen. Lassen Sie subset weg, um alle Spalten zu vergleichen, oder geben Sie die Spalten an, die eine Übereinstimmung definieren. Legen Sie mit keep auf "first", "last" oder False fest, welche Zeilen einer mehrfach vorkommenden Gruppe markiert werden.