Duplikate in Python entfernen: Alle Methoden für Listen & DataFrames

目次

1. Einführung

In der Datenanalyse und im Programmierbereich ist das Entfernen von Duplikatdaten eine grundlegende, unverzichtbare Verarbeitung. Mit Python Duplikate aus Listen, Arrays oder DataFrames entfernen zu wollen – solche Bedürfnisse gibt es bei einem breiten Spektrum von Anfängern bis zu Fortgeschrittenen. Zum Beispiel nach dem Abrufen einer großen Menge an Daten durch Web-Scraping oder beim Laden einer CSV-Datei. Es ist nicht ungewöhnlich, dass dieselben Werte oder Zeilen mehrmals auftreten. Wenn man solche ‚Duplikate‘ unbehandelt lässt, kann das zu verschiedenen Problemen führen, wie ungenauen Aggregationsergebnissen oder unnötigen Verarbeitungsschritten. Python bietet verschiedene Methoden zur Entfernung von Duplikaten, die mit Standardfunktionen oder externen Bibliotheken umgesetzt werden können. In diesem Artikel erklären wir umfassend von grundlegenden Techniken zur Entfernung von Duplikaten in Python über fortgeschrittene Anwendungen bis hin zu Vorsichtsmaßnahmen. Um es für Programmieranfänger leicht verständlich und für fortgeschrittene Nutzer in der Praxis nützlich zu machen, fassen wir für jeden Fall von Listen, Arrays und DataFrames konkrete Beispiele und Punkte zusammen. Während wir Fragen wie ‚Welche Methode sollte ich wählen?‘ oder ‚Warum ändert sich die Reihenfolge?‘ beantworten, stellen wir Know-how vor, das sofort im realen Einsatz verwendet werden kann. Python für die effiziente Entfernung von Duplikatdaten zu nutzen, möchten Sie? Dann orientieren Sie sich gerne daran.

2. Die 3 grundlegenden Muster zum Entfernen von Duplikat-Elementen in Python

Beim Entfernen von Duplikat-Elementen aus Listen oder Arrays in Python werden hauptsächlich die folgenden drei Methoden verwendet. Da jede ihre eigenen Merkmale hat, ist es wichtig, sie je nach Zweck und Situation auszuwählen.

2.1 Duplikat-Entfernung mit set (Methode ohne Beibehaltung der Reihenfolge)

Die einfachste und intuitivste Methode ist die Verwendung des Standard-Datentypus „set“ in Python. Da set eine Sammlung ist, die Duplikate nicht erlaubt, werden Duplikate automatisch entfernt, indem man die Liste in einen set umwandelt.
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)  # Ausgabebeispiel: [1, 2, 3, 4, 5]
Jedoch behält set die Reihenfolge der Elemente nicht bei. Daher ist bei Bedarf an der ursprünglichen Reihenfolge der Liste eine andere Methode erforderlich.

2.2 Reihenfolge-erhaltende Entfernung mit dict.fromkeys

Ab Python 3.7 wird die Reihenfolge der Schlüssel im Dictionary (dict) beibehalten. Eine Technik zur Duplikat-Entfernung, die dies nutzt, ist „dict.fromkeys()“. Mit dieser Methode kann man Duplikate entfernen, ohne die ursprüngliche Reihenfolge der Liste zu verändern.
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(dict.fromkeys(numbers))
print(unique_numbers)  # Ausgabebeispiel: [1, 2, 3, 4, 5]
Da es eine knappe Ein-Zeile-Methode für reihenfolge-erhaltende Duplikat-Entfernung ist, wird sie in vielen Situationen genutzt.

2.3 Reihenfolge-erhaltung und Flexibilität mit List Comprehension + set

Eine weitere häufig verwendete Methode ist die Kombination von List Comprehension und set, um die Reihenfolge zu erhalten und Duplikate zu entfernen. Der Vorteil dieser Methode ist, dass sie flexibler für Bedingungen oder komplexe Datenstrukturen ist.
numbers = [1, 2, 2, 3, 4, 4, 5]
seen = set()
unique_numbers = [x for x in numbers if not (x in seen or seen.add(x))]
print(unique_numbers)  # Ausgabebeispiel: [1, 2, 3, 4, 5]
Diese Methode ermöglicht es, den Fluss „bereits erschienene Elemente überspringen“ explizit zu beschreiben, was die Anwendung auf bedingte Duplikat-Entfernung oder nicht-hashbare Elemente erleichtert.

3. Verarbeitung, wenn Elemente Listen usw. „nicht hashbar“ sind

Die bisher vorgestellte Duplikatentfernung mit set oder dict ist für Elemente wirksam, die „hashbar“ sind, wie Tupel. Allerdings ist eine Python-Liste ein „nicht hashbares“ Objekt, weshalb Listen, die Listen enthalten (z. B. zweidimensionale Listen) oder Listen von Dictionaries nicht direkt als Schlüssel in einem set oder dict verwendet werden können. Daher ist etwas Raffinesse erforderlich. Zum Beispiel betrachten wir eine solche zweidimensionale Liste.
data = [[1, 2], [3, 4], [1, 2], [5, 6]]
In diesem Fall würde set oder dict.fromkeys() einen Fehler verursachen. Daher wird eine Methode verwendet, bei der man manuell überprüft, ob ein bereits vorkommendes Listenelement vorhanden ist, um Duplikate zu entfernen.

3.1 Methode mit List Comprehension + Liste

Die einfachste Methode besteht darin, eine separate Liste der bereits vorkommenden Listen zu führen und Elemente eins nach dem anderen hinzuzufügen.
data = [[1, 2], [3, 4], [1, 2], [5, 6]]
unique_data = []
for item in data:
    if item not in unique_data:
        unique_data.append(item)
print(unique_data)  # Ausgabebeispiel: [[1, 2], [3, 4], [5, 6]]
Mit dieser Methode können Duplikate bei nicht hashbaren Elementen wie Listen, Dictionaries oder Sets entfernt werden, während die Reihenfolge erhalten bleibt.

3.2 Mehr allgemeine Funktionalisierung

Um die Verarbeitung allgemeiner zu gestalten, ist es praktisch, sie als Funktion zu definieren.
def remove_duplicates(seq):
    result = []
    for item in seq:
        if item not in result:
            result.append(item)
    return result

data = [[1, 2], [3, 4], [1, 2], [5, 6]]
print(remove_duplicates(data))  # [[1, 2], [3, 4], [5, 6]]

3.3 Leistung und Hinweise

Diese Methode hat den Vorteil, dass die Reihenfolge erhalten bleibt, andererseits sind bei großen Listen die Suchkosten füritem not in result hoch. Sie ist praktikabel bis zu einigen Tausend Elementen, aber bei Daten mit Zehntausenden von Elementen sollte man andere Methoden in Betracht ziehen (z. B. Elemente in Tupel umwandeln und mit set verwalten).

4. Anwendungsbeispiele: Nur Duplikate extrahieren oder Vorkommenshäufigkeit zählen

Die Entfernung von Duplikaten ist ein Grundbaustein der Daten-Vorverarbeitung, aber in der Praxis gibt es oft Anforderungen wie „Nur die duplizierten Elemente extrahieren“ oder „Die Anzahl der Vorkommen jedes Elements zählen“. In Python können diese Verarbeitungen einfach mit der Standardbibliothek umgesetzt werden.

4.1 Nur die duplizierten Elemente extrahieren

Wenn Sie aus einer Liste nur die Elemente extrahieren möchten, die mehrmals vorkommen, ist die Verwendung der Counter-Klasse aus dem collections-Modul sehr praktisch.
from collections import Counter

 data = [1, 2, 2, 3, 4, 4, 4, 5]
 counter = Counter(data)
 duplicates = [item for item, count in counter.items() if count > 1]
 print(duplicates)  # Ausgabebeispiel: [2, 4]
Mit dieser Methode können Sie die Elemente mit Duplikaten auf einen Blick extrahieren. Natürlich kann sie auch für Strings oder andere hashbare Objekte verwendet werden.

4.2 Die Vorkommenshäufigkeit jedes Elements zählen

Counter ermöglicht es, die Vorkommenshäufigkeit jedes Elements einfach abzurufen. Da es für Aggregationen und Häufigkeitsanalysen nützlich ist, wird es in der Praxis der Datenanalyse hoch geschätzt.
from collections import Counter

 data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
 counter = Counter(data)
 print(counter)  # Ausgabebeispiel: Counter({'apple': 3, 'banana': 2, 'orange': 1})
Das Counter-Objekt kann wie ein Dictionary verwendet werden, sodass Sie leicht überprüfen können, wie oft ein bestimmtes Element vorkommt.

4.3 Alle Duplikate entfernen (nur die einzigartigen Elemente behalten)

Auch um alle duplizierten Elemente zu entfernen und nur die Elemente zu behalten, die nur einmal vorkommen, kann Counter genutzt werden.
from collections import Counter

 data = [1, 2, 2, 3, 4, 4, 5]
 counter = Counter(data)
 unique_items = [item for item, count in counter.items() if count == 1]
 print(unique_items)  # Ausgabebeispiel: [1, 3, 5]
Auf diese Weise können je nach Verwendungszweck und Ziel der Daten verschiedene Extraktionen und Aggregationen flexibel durchgeführt werden, wie „nur Duplikate“, „Vorkommenshäufigkeit“, „einzigartige Elemente“ usw.

5. Entfernen von Duplikaten in Pandas DataFrame

In der Praxis der Datenanalyse und des maschinellen Lernens wird häufig das DataFrame von pandas verwendet. Pandas, das tabellarische Daten effizient handhaben kann, verfügt über bequeme Funktionen, die speziell für die Erkennung und Entfernung von Duplikatdaten ausgelegt sind.

5.1 Duplikatzeilen mit drop_duplicates() entfernen

Das am häufigsten verwendete in pandas ist diedrop_duplicates()-Methode. Diese Funktion ermöglicht es, duplizierte Zeilen (oder Spalten) einfach aus einem DataFrame oder einer Series zu entfernen.
import pandas as pd

 df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice', 'David'],
    'age': [24, 27, 24, 32]
})

 df_unique = df.drop_duplicates()
print(df_unique)
# Ausgabebeispiel:
#     name  age
# 0  Alice   24
# 1    Bob   27
# 3  David   32
In diesem Beispiel bleiben bei Zeilen mit identischem Inhalt nur die erste Zeile übrig.

5.2 Duplikate basierend auf bestimmten Spalten beurteilen (subset-Parameter)

Wenn Sie Duplikate nur basierend auf bestimmten Spalten beurteilen möchten, verwenden Sie densubset-Parameter.
df_unique_name = df.drop_duplicates(subset=['name'])
print(df_unique_name)
# Ausgabebeispiel:
#     name  age
# 0  Alice   24
# 1    Bob   27
# 3  David   32
In diesem Fall wird nur die Duplizierung der Spalte „name“ als Kriterium verwendet.

5.3 Duplikatzeilen markieren mit duplicated()

Wenn Sie nicht entfernen, sondern feststellen möchten, welche Zeilen dupliziert sind, verwenden Sie dieduplicated()-Methode.
print(df.duplicated())
# Ausgabebeispiel:
# 0    False
# 1    False
# 2     True
# 3    False
# dtype: bool
Duplizierte Zeilen werden mitTrue angezeigt, nicht duplizierte mitFalse. Dies kann genutzt werden, um nur duplizierte Zeilen zu extrahieren oder zu entfernen.

5.4 Häufig verwendete Optionen (keep, inplace, ignore_index)

  • keep: 'first' (Standard. Nur den ersten Eintrag behalten), 'last' (Nur den letzten Eintrag behalten), False (Alle Duplikate entfernen)
  • inplace: Bei True wird das ursprüngliche DataFrame direkt aktualisiert
  • ignore_index: Bei True werden die Indizes neu vergeben
df.drop_duplicates(subset=['name'], keep=False, inplace=True)
In diesem Beispiel werden alle Zeilen entfernt, in denen „name“ dupliziert ist.

6. Leistungsvergleich und Auswahl der optimalen Lösung

Beim Entfernen von Duplikaten in Python können je nach gewählter Methode erhebliche Unterschiede in der Ausführungsgeschwindigkeit und der Speichereffizienz auftreten. Hier erläutern wir die Leistungstendenzen gängiger Methoden und die optimale Auswahl je nach Anwendungsfall.

6.1 Geschwindigkeitsvergleich von set und dict.fromkeys

Grundsätzlich ist die Duplikatentfernung mit set oder dict.fromkeys sehr schnell.
  • set: Am einfachsten und schnellsten. Allerdings wird die Reihenfolge nicht beibehalten.
  • dict.fromkeys: Optimal, wenn die Reihenfolge beibehalten werden muss. Ab Python 3.7 behält es die Einfügereihenfolge bei und ermöglicht dennoch eine schnelle Verarbeitung.
Beide können Listen mit Zehntausenden von Elementen problemlos verarbeiten. Allerdings kann dict.fromkeys nicht für Elemente verwendet werden, die keine Schlüssel sein können (nicht hashbar).

6.2 Vergleich mit List Comprehension + set

Die List Comprehension + set (Methode mit seen) zeichnet sich dadurch aus, dass sie die Reihenfolge beibehält und dennoch eine relativ hohe Geschwindigkeit bietet. Allerdings ist sie etwas langsamer als set oder dict.fromkeys (die Differenz wird größer, je mehr Elemente hinzukommen). Diese Methode ist besonders wirksam in Fällen, in denen Flexibilität gefordert ist, wie z. B. „bedingtes Entfernen von Duplikaten“ oder „Umgang mit komplexen Datenstrukturen“.

6.3 Im Fall nicht hashbarer Elemente

Wenn die Liste Listen oder Dictionaries enthält, wird der Suchaufwand von item not in result zu O(n^2), sodass die Verarbeitung bei mehr als Tausenden von Elementen langsam wird. Bei großen Datenmengen, bei denen die Reihenfolge beibehalten werden muss, sollte man auch die Datenstruktur selbst überprüfen (z. B. in Tupel umwandeln, mit IDs verwalten usw.).

6.4 Leistung von pandas‘ drop_duplicates

Das drop_duplicates von pandas ist intern optimiert und arbeitet auch bei Daten mit Hunderttausenden bis Millionen Zeilen schnell. Allerdings kann die Verarbeitungszeit bei überlappenden komplexen Bedingungen oder Angaben mehrerer Spalten etwas länger werden. Auch auf den Speicherverbrauch ist zu achten.

6.5 Zusammenfassung der Richtlinien zur Auswahl

  • Bei großer Datenmenge und wenn die Reihenfolge unwichtig ist: set ist am schnellsten
  • Wenn die Reihenfolge wichtig ist: dict.fromkeys oder List Comprehension + set
  • Bei nicht hashbaren Elementen oder komplexen Bedingungen: List Comprehension + Liste oder Funktionalisierung
  • Bei Datenanalyse, großen Datenmengen, CSV usw.: drop_duplicates von pandas
  • Wenn auch die Häufigkeit oder Aggregation von Duplikaten benötigt wird: collections.Counter
Wählen Sie die optimale Methode basierend auf den Merkmalen jeder Methode und den Eigenschaften sowie dem Verwendungszweck der von Ihnen gehandelten Daten.

7. Zusammenfassung

Die Entfernung von Duplikaten in Python ist eine essenzielle Technik in der Datenverarbeitung und -analyse. In diesem Artikel haben wir die Methoden zur Entfernung von Duplikaten in Listen, Arrays und pandas DataFrames systematisch von den Grundlagen bis zu fortgeschrittenen Anwendungen erklärt. Die wichtigsten Punkte zusammengefasst sind wie folgt.
  • Mit set kann die Entfernung von Duplikaten am einfachsten und schnellsten erfolgen. Allerdings wird die Reihenfolge nicht beibehalten.
  • Mit dict.fromkeys oder List Comprehension + set kann man Duplikate entfernen, während die ursprüngliche Reihenfolge erhalten bleibt.
  • Bei nicht hashbaren Elementen (wie Listen, Dictionaries usw.) ist eine Methode mit List Comprehension + Liste, wie item not in result, wirksam.
  • Mit collections.Counter kann man detailliertere Aggregationen und Analysen durchführen, wie das Extrahieren nur duplicierter Elemente oder das Zählen der Vorkommen.
  • pandas‘ drop_duplicates und duplicated bieten leistungsstarke Funktionen zur Entfernung von Duplikaten, die auch für große Datenmengen geeignet sind und in der Datenanalyse unverzichtbar sind.
Zusätzlich haben die verschiedenen Methoden Vor- und Nachteile sowie Unterschiede in Geschwindigkeit und Speichereffizienz. „Die Verarbeitungsgeschwindigkeit ist wichtig“, „Die Reihenfolge beibehalten wollen“, „Nicht hashbare Daten handhaben“ usw. – je nach Situation und Datencharakteristika die richtige Methode auszuwählen, ist der Trick für effiziente und genaue Datenverarbeitung. Die Entfernung von Duplikaten scheint einfach, ist aber tiefgründig; allein das Wissen um die richtigen Methoden macht die Datenverarbeitung in Python erheblich reibungsloser. Bitte nutzen Sie den Inhalt dieses Artikels in Ihrer täglichen Arbeit oder beim Lernen.

Häufig gestellte Fragen (FAQ)

Q1. Welches ist schneller: set oder dict.fromkeys?

Im Allgemeinen ist die Duplikatentfernung mit set am schnellsten. Allerdings behält set die Reihenfolge der Elemente nicht bei. Wenn Sie die Reihenfolge beibehalten möchten, verwenden Sie dict.fromkeys. dict.fromkeys ab Python 3.7 ist ebenfalls sehr schnell, daher können Sie je nach Anwendungsfall wählen.

Q2. Wie entfernt man Duplikate, während die ursprüngliche Reihenfolge der Liste erhalten bleibt?

dict.fromkeys oder List Comprehension mit set (unter Verwendung einer seen-Menge) sind effektiv. Beide Methoden erhalten die Reihenfolge. Die alleinige Verwendung von set führt zu einer Veränderung der Reihenfolge.

Q3. Wenn die Liste weitere Listen oder Dictionaries enthält, tritt bei der Verwendung von set oder dict.fromkeys ein Fehler auf. Was kann man tun?

Nicht-hashbare Elemente (wie Listen oder Dictionaries) können nicht als Schlüssel in set oder dict verwendet werden. In diesem Fall ist die manuelle Überprüfung, ob ein Element bereits hinzugefügt wurde, unter Verwendung einer Liste (mit for-Schleife + if-Anweisung oder als Funktion), die zuverlässigste Methode, während append verwendet wird.

Q4. Wie entfernt man Duplikate in pandas basierend nur auf einer bestimmten Spalte?

Verwenden Sie das subset-Argument von drop_duplicates. Zum Beispieldf.drop_duplicates(subset=['name'])bewertet Duplikate nur basierend auf der Spalte „name“.

Q5. Wie entfernt man alle Duplikat-Elemente und behält nur Werte, die genau einmal vorkommen?

Verwenden Sie collections.Counter, um nur Elemente mit einer Häufigkeit von 1 zu extrahieren.
from collections import Counter

 data = [1, 2, 2, 3, 4, 4, 5]
 counter = Counter(data)
 unique_items = [item for item, count in counter.items() if count == 1]
 # unique_items = [1, 3, 5]

Q6. Wie prüft man Duplikatzeilen in einem DataFrame, anstatt sie zu entfernen?

Verwenden Sie die duplicated()-Methode. Sie gibt True für Duplikatzeilen und False für andere zurück. Sie kann auch verwendet werden, um nur die Duplikat-Teile zu extrahieren.

Q7. Worauf sollte man bei der Duplikatentfernung bei Daten mit Zehntausenden von Einträgen achten?

set und pandas‘ drop_duplicates sind robust bei großen Datenmengen, aber der Speicherverbrauch und die Ausführungszeit können stark ansteigen. Erwägen Sie bei Bedarf Sampling oder Aufteilung der Verarbeitung.

Q8. Warum ist die Duplikatentfernung notwendig?

Duplikatdaten können zu fehlerhaften Ergebnissen in der statistischen Analyse, der Erstellung von Grafiken oder im maschinellen Lernen führen. Die Duplikatentfernung ist eine wichtige Vorverarbeitungsschritt für zuverlässige Analysen und Zusammenfassungen.
年収訴求