Rilevare e rimuovere i duplicati
Individui duplicati esatti e parziali con duplicated() e drop_duplicates() e decida quale record duplicato conservare.
Rilevare e rimuovere i duplicati è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Perché i duplicati sono importanti
Le righe duplicate aumentano silenziosamente conteggi, totali dei ricavi e medie senza generare alcun messaggio di errore. Un dataset di vendite con 500 record di ordini duplicati sovrastimerà i ricavi esattamente della somma di quei 500 ordini. Individuare e rimuovere i duplicati è una delle prime operazioni di pulizia da eseguire, prima di qualsiasi aggregazione o modellazione, perché gli errori successivi si accumulano a partire da questa singola fonte di corruzione.
import pandas as pd
df = pd.read_csv('orders.csv')
print('Shape before dedup:', df.shape)
print('Exact duplicates:', df.duplicated().sum())Individuare i duplicati esatti
df.duplicated() restituisce una Series booleana che vale True per ogni riga che è una copia esatta di una riga precedente. Per impostazione predefinita, keep='first' contrassegna tutte le occorrenze tranne la prima. Passando keep=False vengono contrassegnate tutte le occorrenze di un duplicato: è utile quando si desidera esaminare tutte le copie di un record duplicato prima di decidere quale conservare.
# Mark only the second+ occurrences
partial_dups = df[df.duplicated(keep='first')]
print('Rows to remove:', len(partial_dups))
# Mark ALL copies of any duplicate
all_dups = df[df.duplicated(keep=False)]
print('Rows involved in duplicates:', len(all_dups))Eliminare i duplicati esatti
Rimuova le righe duplicate esatte con df.drop_duplicates(). Per impostazione predefinita, il metodo conserva la prima occorrenza ed elimina tutte le altre. Passi keep='last' per conservare il record più recente se i dati includono un timestamp e le righe successive sono considerate più autorevoli. Controlli sempre il numero di righe prima e dopo l’operazione, per verificare che sia stato rimosso il numero previsto di righe.
df_clean = df.drop_duplicates(keep='first')
print('Rows removed:', len(df) - len(df_clean))
print('Shape after dedup:', df_clean.shape)Duplicati parziali: basati su chiavi
Le righe possono essere duplicati parziali: condividono una chiave aziendale (come order_id), ma differiscono in altre colonne a causa di un bug nel sistema upstream che ha creato due versioni dello stesso record. Utilizzi df.duplicated(subset=['order_id']) per trovare le righe con la stessa chiave ma valori potenzialmente diversi nelle altre colonne. Esamini queste righe prima di decidere come riconciliarle.
key_dups = df[df.duplicated(subset=['order_id'], keep=False)]
print('Orders with duplicate IDs:')
print(key_dups.sort_values('order_id').head(10))Quale duplicato mantenere
Quando esistono duplicati parziali, deve decidere quale record sia quello autorevole. Strategie comuni: mantenere la riga con il timestamp più recente (aggiornamento più recente), la riga con il maggior numero di valori non nulli oppure la riga con l'importo più elevato se uno dei record contiene correzioni. Ordini i dati in base al criterio di spareggio e poi elimini i duplicati mantenendo la prima (o l'ultima) occorrenza.
# Keep the record with the latest update timestamp
df_sorted = df.sort_values('updated_at', ascending=False)
df_dedup = df_sorted.drop_duplicates(subset=['order_id'], keep='first')
print('Kept:', len(df_dedup), 'unique orders')Rilevamento dei quasi duplicati
I quasi duplicati sono righe che rappresentano la stessa entità ma differiscono leggermente: ad esempio, lo stesso nome cliente con un refuso oppure la stessa transazione con una differenza di arrotondamento di 1 centesimo. Il rilevamento dei duplicati esatti non li individua. Un approccio consiste nel raggruppare per la colonna chiave e contare: se un nome cliente compare con lievi variazioni, utilizzi .str.strip().str.lower() per normalizzarlo prima della deduplicazione.
df['customer_normalized'] = df['customer_name'].str.strip().str.lower()
near_dups = df.groupby('customer_normalized').size().sort_values(ascending=False)
print(near_dups[near_dups > 1].head())Deduplicazione con aggregazione GroupBy
Quando deve unire righe duplicate invece di limitarsi a eliminarle, utilizzi groupby().agg(). Ad esempio, se due righe rappresentano lo stesso ordine ma una contiene l'indirizzo di spedizione e l'altra quello di fatturazione, può aggregarle con 'first' (privilegiando i valori non nulli) oppure con una funzione personalizzata che combini i valori non nulli tra i duplicati.
def coalesce(*args):
for a in args:
if pd.notna(a):
return a
return None
df_merged = df.groupby('order_id').agg(
customer=('customer_name', 'first'),
amount=('amount', 'max'),
date=('order_date', 'min')
).reset_index()
print(df_merged.head())Verifica della sensibilità all'ordine delle righe
Il risultato di drop_duplicates(keep='first') dipende dall'ordine delle righe. Se il DataFrame è stato caricato da una query al database senza una clausola ORDER BY, l'ordine delle righe non è deterministico: il record mantenuto può quindi variare tra un'esecuzione e l'altra. Ordini sempre i dati in base a una chiave stabile (ad esempio, la chiave primaria o il timestamp) prima della deduplicazione, in modo da rendere il processo deterministico e riproducibile.
# Sort by primary key before deduplication for deterministic results
df = df.sort_values('order_id').reset_index(drop=True)
df_clean = df.drop_duplicates(subset=['order_id'], keep='first')
print('Deterministic dedup complete.')Verifica del risultato della deduplicazione
Dopo la deduplicazione, verifichi il risultato con tre controlli: nessun duplicato esatto residuo (df_clean.duplicated().sum() == 0), nessuna chiave aziendale duplicata (df_clean.duplicated(subset=['order_id']).sum() == 0) e un numero di righe atteso plausibile. Scriva questi controlli come asserzioni, in modo che generino un errore evidente se future modifiche ai dati rendono non valida la logica di pulizia.
assert df_clean.duplicated().sum() == 0, 'Exact duplicates remain'
assert df_clean.duplicated(subset=['order_id']).sum() == 0, 'Duplicate order IDs remain'
print('Deduplication verified. Rows:', len(df_clean))Documentazione dei duplicati rimossi
Una buona pulizia dei dati è riproducibile e verificabile. Registri in un dizionario del report di pulizia il numero di righe rimosse, la chiave di deduplicazione e la regola di spareggio. Salvi questo report insieme al file dei dati puliti, così chiunque esegua nuovamente la pipeline potrà verificare le decisioni di pulizia senza dover rileggere il codice. La trasparenza nella pulizia dei dati aumenta la fiducia nei risultati dell'analisi.
cleaning_log = {
'original_rows': len(df),
'dedup_key': 'order_id',
'tiebreak': 'keep first by updated_at desc',
'rows_removed': len(df) - len(df_clean),
'clean_rows': len(df_clean)
}
for k, v in cleaning_log.items():
print(f'{k}: {v}')Salvataggio del dataset deduplicato
Salvi il DataFrame deduplicato in un nuovo file invece di sovrascrivere l'originale. In questo modo conserva i dati grezzi per eventuali verifiche. Assegni al file un nome chiaro con il suffisso _clean o _deduped e includa la data di esecuzione, così sarà possibile distinguere più passaggi di pulizia. Utilizzi Parquet per ricaricare rapidamente i dati nei passaggi successivi della pipeline.
from datetime import date
output_path = f'orders_clean_{date.today()}.parquet'
df_clean.to_parquet(output_path, index=False)
print(f'Saved {len(df_clean)} rows to {output_path}')Verifica rapida
Verifichi la comprensione dei concetti di analisi dei dati trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato a: rilevare duplicati esatti e parziali con duplicated() e drop_duplicates(), scegliere quale duplicato mantenere utilizzando strategie di ordinamento e aggregazione e verificare i risultati con asserzioni e registrare le decisioni di pulizia. Ora passeremo alle tecniche di rilevamento e trattamento dei valori anomali.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Rilevare e rimuovere i duplicati» è gratuita?
Sì — il testo completo di «Rilevare e rimuovere i duplicati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Rilevare e rimuovere i duplicati»?
Individui duplicati esatti e parziali con duplicated() e drop_duplicates() e decida quale record duplicato conservare. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Rilevare e rimuovere i duplicati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Rilevare e rimuovere i duplicati
- Rilevare e trattare gli outlier
- Uniformare le categorie incoerenti
- Validazione dello schema e asserzioni