Skip to content

pandas: Trovare e rimuovere righe duplicate di DataFrame, Serie

Python

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
  • 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.