unique() / nunique() în pandas

Explorarea datelor pandas 1.0+

unique returnează valorile distincte dintr-o coloană, în ordinea apariției; nunique spune câte valori distincte sunt.

Sintaxă
s.unique()
pd.unique(valori)
s.nunique(dropna=True)
df.nunique(axis=0, dropna=True)

Ce face unique() / nunique()

unique() returnează valorile diferite dintr-un Series, fiecare o singură dată, în ordinea în care apar prima dată (nu sortate). Rezultatul este un array: pentru numere un array NumPy, pentru text un StringArray. Cu .tolist() îl transformi în listă Python. Funcția pd.unique face același lucru pe un array NumPy, un Index sau un Series.

nunique() numără valorile distincte. Implicit nu numără valorile lipsă (dropna=True), deși unique() le include în rezultat. Pe un DataFrame, nunique() dă numărul de valori distincte pentru fiecare coloană.

Parametri

Parametru Descriere
values La pd.unique: un array NumPy, un Index sau un Series. O listă Python simplă nu este acceptată.
dropna La nunique: dacă lasă deoparte valorile lipsă (implicit True).
axis La DataFrame.nunique: 0 pe coloane (implicit), 1 pe rânduri.

Ce returnează

unique: un array cu valorile distincte. nunique: un număr întreg (pe Series) sau un Series de numere (pe DataFrame).

Exemple

Exemplul 1: Valorile distincte dintr-o coloană

Orașele apar în ordinea primei apariții. tolist() dă o listă Python obișnuită.

import pandas as pd

orase = pd.Series(["Iași", "Cluj", "Iași", "Brașov", "Cluj"])
print(orase.unique())
print(orase.unique().tolist())
print(orase.nunique())

Rezultat

<StringArray>
['Iași', 'Cluj', 'Brașov']
Length: 3, dtype: str
['Iași', 'Cluj', 'Brașov']
3

Exemplul 2: Valori lipsă: unique le arată, nunique nu le numără

import numpy as np
import pandas as pd

note = pd.Series([10, 9, None, 10, 8, None])
print(note.unique())
print(note.nunique())
print(note.nunique(dropna=False))
print(pd.unique(np.array([3, 1, 3, 2, 1])))

Rezultat

[10.  9. nan  8.]
3
4
[3 1 2]

Exemplul 3: nunique pe toate coloanele

Câte valori diferite are fiecare coloană: 4 clienți, 2 orașe, 3 produse.

import pandas as pd

comenzi = pd.DataFrame({
    "client": ["Ana", "Mihai", "Ana", "Ioana", "Radu"],
    "oraș": ["Iași", "Cluj", "Iași", "Iași", "Cluj"],
    "produs": ["carte", "pix", "caiet", "carte", "pix"],
})
print(comenzi.nunique())

Rezultat

client    4
oraș      2
produs    3
dtype: int64

Greșeli frecvente

  • Te aștepți ca unique() să sorteze valorile. Le păstrează în ordinea apariției; sortează după, de exemplu cu sorted(s.unique().tolist()).
  • Folosești len(s.unique()) ca număr de valori distincte și obții cu 1 mai mult decât nunique(): unique() include NaN, nunique() nu.
  • Dai o listă Python lui pd.unique([3, 1, 3]): în pandas 3 primești TypeError: unique requires a Series, Index, ExtensionArray, np.ndarray or NumpyExtensionArray got list. Transformă lista în np.array sau pd.Series.
  • Apelezi df.unique() pe un tabel întreg: AttributeError. unique există doar pe Series; pe tabel folosește nunique() sau drop_duplicates().

Comenzi înrudite

  • 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.Series(): Creează o coloană de valori cu etichete (index): din listă, din dicționar sau dintr-o singură valoare.
  • describe(): Calculează statistici rapide pe coloane: număr, medie, abatere standard, minim, cuartile, maxim; pentru text, valori unice și cea mai frecventă.
  • dropna(): Șterge rândurile (sau coloanele) care au valori lipsă: oricare, doar complet goale sau doar în anumite coloane.