Ce face duplicated() / drop_duplicates()
duplicated() întoarce o serie de True/False: True pentru fiecare rând care repetă un rând de mai sus. drop_duplicates() întoarce tabelul fără aceste rânduri. Implicit se compară toate coloanele.
Cu subset alegi coloanele care contează: de exemplu, doi clienți cu același email sunt dubluri chiar dacă diferă orașul. keep spune ce apariție rămâne: "first" (implicit) prima, "last" ultima, iar False le marchează (sau le șterge) pe toate.
df.duplicated().sum() îți spune rapid câte rânduri repetate există, iar df[df.duplicated(keep=False)] îți arată toate rândurile implicate, ca să le verifici înainte de ștergere.
Parametri
| Parametru | Descriere |
|---|---|
subset |
Coloana sau lista de coloane după care se compară. Implicit, toate coloanele. |
keep |
"first" (implicit): prima apariție nu e considerată dublură. "last": ultima rămâne. False: toate aparițiile sunt marcate ca dubluri. |
ignore_index |
Doar la drop_duplicates: cu True rândurile rămase sunt renumerotate de la 0. |
Ce returnează
duplicated(): o Series de bool, câte una pe rând. drop_duplicates(): un DataFrame nou, fără dubluri.
Exemple
Exemplul 1: Rânduri repetate complet
Rândul 2 este identic cu rândul 0 (Ana, Iași), deci duplicated() îl marchează cu True, iar drop_duplicates() îl elimină.
import pandas as pd
df = pd.DataFrame({
"nume": ["Ana", "Mihai", "Ana", "Ioana"],
"oras": ["Iași", "Cluj", "Iași", "Iași"],
})
print(df.duplicated())
print("dubluri:", df.duplicated().sum())
print()
print(df.drop_duplicates())
Rezultat
0 False
1 False
2 True
3 False
dtype: bool
dubluri: 1
nume oras
0 Ana Iași
1 Mihai Cluj
3 Ioana Iași
Exemplul 2: Dubluri după email, păstrând ultima înregistrare
Ana s-a înscris de două ori cu același email, din orașe diferite. Cu subset="email" și keep="last" rămâne înregistrarea mai nouă (Cluj).
import pandas as pd
df = pd.DataFrame({
"email": ["ana@exemplu.ro", "mihai@exemplu.ro", "ana@exemplu.ro"],
"oras": ["Iași", "Brașov", "Cluj"],
"data": ["2026-03-01", "2026-03-05", "2026-04-10"],
})
print(df.drop_duplicates(subset="email", keep="last", ignore_index=True))
Rezultat
email oras data
0 mihai@exemplu.ro Brașov 2026-03-05
1 ana@exemplu.ro Cluj 2026-04-10
Exemplul 3: keep=False: vezi toate aparițiile
Cu keep=False sunt marcate ambele comenzi cu numărul 102, ca să le poți verifica. drop_duplicates(keep=False) le-ar șterge pe amândouă.
import pandas as pd
comenzi = pd.DataFrame({
"nr": [101, 102, 103, 102],
"client": ["Ana", "Mihai", "Ioana", "Mihai"],
"suma": [250, 120, 90, 120],
})
print(comenzi[comenzi.duplicated(subset="nr", keep=False)])
print()
print(comenzi.drop_duplicates(subset="nr", keep=False))
Rezultat
nr client suma
1 102 Mihai 120
3 102 Mihai 120
nr client suma
0 101 Ana 250
2 103 Ioana 90
Greșeli frecvente
- Cauți dubluri după toate coloanele când doar una contează (emailul, CNP-ul, numărul comenzii). Rândurile care diferă printr-un spațiu sau o dată nu sunt considerate dubluri; folosește
subset. - Textele diferă doar prin litere mari sau spații (
"Ana"și"ana "), deci nu sunt văzute ca dubluri. Curăță întâi coloana custr.strip()șistr.lower(). - Uiți să atribui rezultatul:
df.drop_duplicates()nu modificădf, ci întoarce un tabel nou.
Comenzi înrudite
dropna(): Șterge rândurile (sau coloanele) care au valori lipsă: oricare, doar complet goale sau doar în anumite coloane.value_counts(): Numără de câte ori apare fiecare valoare într-o coloană (sau fiecare combinație de valori pe rânduri), în ordine descrescătoare.pd.merge(): Unește două tabele după o coloană comună (de exemplu id-ul clientului), ca un JOIN din SQL: inner, left, right sau outer.DataFrame.sort_values() și sort_index(): Ordonează rândurile după valorile uneia sau mai multor coloane (sort_values) sau după etichetele din index (sort_index).