duplicated() / drop_duplicates() în pandas

Găsește rândurile repetate și le elimină, după toate coloanele sau doar după cele alese, păstrând prima sau ultima apariție.

Sintaxă
df.duplicated(subset=None, keep='first')
df.drop_duplicates(subset=None, *, keep='first', ignore_index=False)

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 cu str.strip() și str.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).