value_counts() în pandas

Explorarea datelor pandas 1.0+

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.

Sintaxă
s.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
df.value_counts(subset=None, normalize=False, sort=True, ascending=False, dropna=True)

Ce face value_counts()

value_counts() pe o coloană returnează un Series: indexul conține valorile distincte, iar valorile sunt numărul de apariții, de la cea mai frecventă la cea mai rară. E modul obișnuit de a vedea distribuția unei coloane de categorii (orașe, produse, note).

Cu normalize=True primești proporții (între 0 și 1) în loc de numere. Valorile lipsă nu sunt numărate implicit; cu dropna=False apar și ele, pe un rând separat.

Pe un DataFrame (din pandas 1.1), metoda numără combinațiile de valori de pe rânduri; cu subset alegi coloanele. Rezultatul are un index pe mai multe niveluri.

Parametri

Parametru Descriere
normalize Dacă True, returnează proporții în loc de numere.
sort Dacă sortează după frecvență (implicit True). Cu False păstrează ordinea primei apariții.
ascending Dacă sortează crescător (de la cea mai rară).
bins Doar la Series numeric: împarte valorile în atâtea intervale și numără pe intervale.
dropna Dacă lasă deoparte valorile lipsă (implicit True).
subset Doar la DataFrame: coloanele ale căror combinații se numără.

Ce returnează

Un Series cu numărul (sau proporția) aparițiilor, numit count (sau proportion).

Exemple

Exemplul 1: Câte comenzi pe fiecare oraș

import pandas as pd

orase = pd.Series(["Iași", "Cluj", "Iași", "Brașov", "Iași", "Cluj"], name="oraș")
print(orase.value_counts())
print(orase.value_counts(ascending=True))

Rezultat

oraș
Iași      3
Cluj      2
Brașov    1
Name: count, dtype: int64
oraș
Brașov    1
Cluj      2
Iași      3
Name: count, dtype: int64

Exemplul 2: Proporții și valori lipsă

Proporțiile se calculează doar din cele 7 note completate: 3 note de 10 din 7 înseamnă aproximativ 0.43. Cu dropna=False apare și valoarea lipsă.

import pandas as pd

note = pd.Series([10, 9, 10, 8, 9, 10, 7, None])
print(note.value_counts(normalize=True))
print(note.value_counts(dropna=False))

Rezultat

10.0    0.428571
9.0     0.285714
8.0     0.142857
7.0     0.142857
Name: proportion, dtype: float64
10.0    3
9.0     2
8.0     1
7.0     1
NaN     1
Name: count, dtype: int64

Exemplul 3: Combinații de coloane pe un DataFrame

Fiecare pereche (oraș, produs) este numărată o dată pentru fiecare rând pe care apare.

import pandas as pd

comenzi = pd.DataFrame({
    "oraș": ["Iași", "Cluj", "Iași", "Iași", "Cluj"],
    "produs": ["carte", "carte", "pix", "carte", "pix"],
    "preț": [45, 50, 3, 45, 4],
})
print(comenzi.value_counts(subset=["oraș", "produs"]))

Rezultat

oraș  produs
Iași  carte     2
Cluj  carte     1
Iași  pix       1
Cluj  pix       1
Name: count, dtype: int64

Greșeli frecvente

  • Te miri că numărul total este mai mic decât numărul de rânduri. Valorile lipsă nu sunt numărate implicit; adaugă dropna=False.
  • Scrii Iași și iasi sau Iași (cu spațiu la final) în date: apar ca valori diferite. Curăță textul înainte (str.strip(), str.lower()).
  • Cauți coloana cu numărul în rezultat ca într-un tabel. Rezultatul este un Series; pentru tabel folosește .reset_index().

Comenzi înrudite

  • unique() / nunique(): unique returnează valorile distincte dintr-o coloană, în ordinea apariției; nunique spune câte valori distincte sunt.
  • DataFrame.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.
  • describe(): Calculează statistici rapide pe coloane: număr, medie, abatere standard, minim, cuartile, maxim; pentru text, valori unice și cea mai frecventă.
  • isna() / notna(): Arată care valori lipsesc (NaN, None, NaT) dintr-un tabel; cu isna().sum() afli câte lipsesc în fiecare coloană.