
Usa duplicated() e drop_duplicates() per trovare, estrarre, contare e rimuovere le righe duplicate da pandas.DataFrame, pandas.Series.
In questo articolo vengono descritti i seguenti contenuti.
- Trova righe duplicato:
duplicated()- Determina quali duplicati contrassegnare:
keep - Specifica la colonna per trovare il duplicato:
subset - Conta le righe duplicate/non duplicate
- Determina quali duplicati contrassegnare:
- Rimuovi le righe duplicate:
drop_duplicates()
- Aggrega in base a elementi duplicati:
groupby()
I seguenti dati sono usati come esempio. la riga #6 è un duplicato della riga #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
Il file CSV di esempio è collegato di seguito.
pandas.DataFrame viene utilizzato nel codice di esempio seguente, ma può essere applicato quasi allo stesso modo a pandas.Series.
Trova righe duplicato:duplicated()
duplicated() produce booleano pandas.Series con righe duplicate come True. Per impostare, tutte le colonne vengono utilizzate per se una riga è duplicata o meno.
print(df.duplicated())
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# 5 False
# 6 True
# dtype: bool
È possibile utilizzare questo pandas.Series per estrarre righe duplicate dal pandas.DataFrame originale.
print(df[df.duplicated()])
# name age state point
# 6 Dave 68 TX 70
Determina quali duplicati contrassegnare:keep
Il valore predefinito dell’argomento keep è ‘first’ e la prima riga duplicata viene determinato come False come nell’esempio precedente.
Se imposti keep=’last’, l’ultima riga duplicata viene determinata come False.
print(df.duplicated(keep='last'))
# 0 False
# 1 False
# 2 False
# 3 True
# 4 False
# 5 False
# 6 False
# dtype: bool
Con keep = False, tutte le righe duplicate vengono determinate come True.
print(df.duplicated(keep=False))
# 0 False
# 1 False
# 2 False
# 3 True
# 4 False
# 5 False
# 6 True
# dtype: bool
Specifica la colonna per trovare il duplicato:subset
Come accennato in precedenza, per definire automaticamente, tutte le colonne vengono utilizzate per definire i duplicati.
È possibile specificare quale colonna utilizzare per definire i duplicati nel sottoinsieme di argomenti.
print(df.duplicated(subset='state'))
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# 5 True
# 6 True
# dtype: bool
È anche possibile specificare più colonne con un elenco.
print(df.duplicated(subset=['state', 'point']))
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# 5 False
# 6 True
# dtype: bool
Conta le righe duplicate/non duplicate
Puoi contare il numero di righe duplicate contando True in pandas.Series ottenuto con duplicated(). Il numero di True può essere contattato con il metodo sum().
print(df.duplicated().sum())
# 1
Se vuoi contare il numero di False (= il numero di righe non duplicate), puoi invertirlo con negazione ~ e quindi contare True con sum().
print(~df.duplicated())
# 0 True
# 1 True
# 2 True
# 3 True
# 4 True
# 5 True
# 6 False
# dtype: bool
print((~df.duplicated()).sum())
# 6
Puoi anche contare True e False insieme a value_counts().
print(df.duplicated().value_counts())
# False 6
# True 1
# dtype: int64
Si noti che il risultato dipende dall’argomento. Utilizzare correttamente in base al proprio scopo.
print(df.duplicated(keep=False).value_counts())
# False 5
# True 2
# dtype: int64
Rimuovi le righe duplicate:drop_duplicates()
Puoi usare duplicated() e l’operatore di negazione ~ per rimuovere le righe duplicate.
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
Puoi anche rimuovere le righe duplicate con drop_duplicates().
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
mantieni, sottoinsieme
Gli argomenti keep e subset possono essere impostati sia per drop_duplicates() che per duplicated().
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
un posto
Per programma predefinito, viene restituito un nuovo DataFrame con le righe duplicate rimosse. Con l’argomento inplace = True, le righe duplicate vengono rimosse dal DataFrame originale.
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
Aggrega in base a elementi duplicati:groupby()
Usa groupby() per aggregare valori in base a elementi duplicati.
Nell’esempio seguente, viene calcolata la media dei valori delle colonne numeriche età e punto per ogni elemento duplicato nella colonna stato.
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
È anche possibile concatenare stringhe e convertirle in elenchi.
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
Il metodo delle stringhe join() viene applicato per concatenare le stringhe in un’espressione lambda.
La funzione integrata list() viene applicata per la conversione in un elenco.
