
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
- Legt fest, welche Duplikate markiert werden sollen:
- 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.