目次
- 1 1. Einführung
- 2 2. Die 3 grundlegenden Muster zum Entfernen von Duplikat-Elementen in Python
- 3 3. Verarbeitung, wenn Elemente Listen usw. „nicht hashbar“ sind
- 4 4. Anwendungsbeispiele: Nur Duplikate extrahieren oder Vorkommenshäufigkeit zählen
- 5 5. Entfernen von Duplikaten in Pandas DataFrame
- 6 6. Leistungsvergleich und Auswahl der optimalen Lösung
- 7 7. Zusammenfassung
- 8 Häufig gestellte Fragen (FAQ)
- 8.1 Q1. Welches ist schneller: set oder dict.fromkeys?
- 8.2 Q2. Wie entfernt man Duplikate, während die ursprüngliche Reihenfolge der Liste erhalten bleibt?
- 8.3 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?
- 8.4 Q4. Wie entfernt man Duplikate in pandas basierend nur auf einer bestimmten Spalte?
- 8.5 Q5. Wie entfernt man alle Duplikat-Elemente und behält nur Werte, die genau einmal vorkommen?
- 8.6 Q6. Wie prüft man Duplikatzeilen in einem DataFrame, anstatt sie zu entfernen?
- 8.7 Q7. Worauf sollte man bei der Duplikatentfernung bei Daten mit Zehntausenden von Einträgen achten?
- 8.8 Q8. Warum ist die Duplikatentfernung notwendig?
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 derCounter
-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 mitset
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.
6.2 Vergleich mit List Comprehension + set
Die List Comprehension + set (Methode mitseen
) 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 vonitem 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
Dasdrop_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
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.
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]