Skip to content

Pandas: Finden und Entfernen doppelter Zeilen in DataFrame, Series

Python

Verwenden Sie dumped() und drop_duplicates(), um doppelte Zeilen aus pandas.DataFrame, pandas.Series zu finden, zu extrahieren, zu umfassen und zu entfernen.

Dieser Artikel hat folgenden Inhalt.

  • Doppelte Zeilen finden:duplicated()
    • Legt fest, welche Duplikate markiert werden sollen:keep
    • Geben Sie die Spalte an, um ein Duplikat zu finden:subset
    • Zählen Sie doppelte/nicht doppelte Zeilen
  • Doppelte Zeilen entfernen:drop_duplicates()
  • Aggregatieren basierend auf doppelten Elementen:groupby()

Die folgenden Daten werden als Beispiel verwendet. Zeile #6 ist ein Duplikat von Zeile #3.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df = df.append({'name': 'Dave', 'age': 68, 'state': 'TX', 'point': 70}, ignore_index=True)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57
# 6     Dave   68    TX     70

Die Beispiel-CSV-Datei ist unten verlinkt.

pandas.DataFrame WIRD im following Beispielcode used, kann aber schnell genauso auf pandas.Series angewendet werden.

Doppelte Zeilen finden:duplicated()

Die Methode „Duplicated()“ gibt den booleschen Wert „pandas.Series“ mit doppelten Zeilen als „True“ zurück. Standardmäßig Werden alle Spalten used, um zu bestimmen, ob eine Zeile ein Duplikat ist oder nicht.

print(df.duplicated())
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

Sie können diese pandas.Series verwenden, um doppelte Zeilen aus dem ursprünglichen pandas.DataFrame zu extrahieren.

print(df[df.duplicated()])
#    name  age state  point
# 6  Dave   68    TX     70

Legt fest, welche Duplikate markiert werden sollen:keep

Der Standardwert des Arguments keep ist „first“, und die erste doppelte Zeile wird wie im Beispiel als „False“ bestimmt.

Wenn Sie keep=’last‘ setzen, wird die letzte doppelte Zeile als False bestimmt.

print(df.duplicated(keep='last'))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6    False
# dtype: bool

Mit keep = False werden alle doppelten Zeilen als wahr bestimmt.

print(df.duplicated(keep=False))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6     True
# dtype: bool

Geben Sie die Spalte an, um ein Duplikat zu finden:subset

Wie oben erwähnt, werden standardmäßig alle Spalten verwendet, um Duplikate zu identifizieren.

Sie können angeben, welche Spalte zum Identifizieren von Duplikaten in der Argumentteilmenge verwendet werden soll.

print(df.duplicated(subset='state'))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# 5     True
# 6     True
# dtype: bool

Es ist auch möglich, mehrere Spalten mit einer Liste hinzuzufügen.

print(df.duplicated(subset=['state', 'point']))
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

Zählen Sie doppelte/nicht doppelte Zeilen

Sie can die Anzahl der doppelten Zeilen umfassen, und zwar True in pandas.Series zählen, die Sie mit duplicated() erhalten haben. Die Anzahl von True kann mit der Methode sum() gezählt werden.

print(df.duplicated().sum())
# 1

Wenn SIE die Anzahl von False (= die Anzahl der nicht doppelten Zeilen) umfassen möchten, können Sie sie mit Negation ~ invertieren und dann True mit sum() umfassen.

print(~df.duplicated())
# 0     True
# 1     True
# 2     True
# 3     True
# 4     True
# 5     True
# 6    False
# dtype: bool

print((~df.duplicated()).sum())
# 6

Sie können True und False auch zusammen mit value_counts() umfassen.

print(df.duplicated().value_counts())
# False    6
# True     1
# dtype: int64

Beachten Sie, dass das Ergebnis vom Argument abhängig bleibt. Verwenden Sie es entsprechend Ihrem Zweck.

print(df.duplicated(keep=False).value_counts())
# False    5
# True     2
# dtype: int64

Doppelte Zeilen entfernen:drop_duplicates()

Sie können dumped() und den Negationsoperator ~ verwenden, um doppelte Zeilen zu entfernen.

print(df[~df.duplicated()])
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Sie können doppelte Zeilen auch mit drop_duplicates() entfernen.

print(df.drop_duplicates())
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

behalten, Teilmenge

Die Argumente keep undsubset können sowohl für drop_duplicates() als auch für duplicated() gesetzt werden.

print(df.drop_duplicates(keep=False))
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.drop_duplicates(subset='state'))
#     name  age state  point
# 0  Alice   24    NY     64
# 1    Bob   42    CA     92
# 3   Dave   68    TX     70

an Ort und Stelle

Standardmäßig wird ein neuer DataFrame mit entfernten doppelten Zeilen zurückgegeben. Mit dem Argument inplace = True werden doppelte Zeilen aus dem ursprünglichen DataFrame entfernt.

df.drop_duplicates(subset='state', keep='last', inplace=True)
print(df)
#     name  age state  point
# 4  Ellen   24    CA     88
# 5  Frank   30    NY     57
# 6   Dave   68    TX     70

Aggregatieren basierend auf doppelten Elementen:groupby()

Verwenden Sie groupby(), um Werte basierend auf doppelten Elementen zu aggregieren.

Im following Beispiel WIRD der Durchschnitt der Werte der numerischen Spalten Alter und Punkt für jedes doppelte Element in der Spalte Zustand berechnet.

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.groupby('state').mean())
#         age      point
# state                 
# CA     28.0  83.333333
# NY     27.0  60.500000
# TX     68.0  70.000000

Es ist auch möglich, Strings zu verketten und in Listen umzuwandeln.

print(df.groupby('state').agg(
    {'name': lambda x: ','.join(x),
     'age': 'mean',
     'point': 'mean'}))
#                     name  age      point
# state                                   
# CA     Bob,Charlie,Ellen   28  83.333333
# NY           Alice,Frank   27  60.500000
# TX                  Dave   68  70.000000

print(df.groupby('state').agg(
    {'name': list,
     'age': 'mean',
     'point': 'mean'}))
#                         name  age      point
# state                                       
# CA     [Bob, Charlie, Ellen]   28  83.333333
# NY            [Alice, Frank]   27  60.500000
# TX                    [Dave]   68  70.000000

Die Zeichenfolgenmethode join() WIRD angewendet, um Zeichenfolgen in Einem Lambda-Ausdruck zu verketten.

Die eingebaute Funktion list() wird angewendet, um in eine Liste zu konvertieren.