pd.cut() în pandas

Remodelarea tabelelor pandas 1.0+

Împarte valori numerice în intervale stabilite de tine (de exemplu grupe de vârstă) și pune fiecărei valori eticheta intervalului.

Sintaxă
pd.cut(x, bins, right=True, labels=None, include_lowest=False, ...)

Ce face pd.cut()

pd.cut() transformă o coloană de numere într-o coloană de categorii. Dai limitele intervalelor în bins, de exemplu [0, 18, 30, 50, 100], iar fiecare valoare primește intervalul în care se află. Cu labels pui nume clare, ca „tânăr” sau „adult”.

Implicit intervalele sunt închise la dreapta: (18, 30] conține 30, dar nu 18. Cu right=False devin [18, 30). O valoare egală cu prima limită sau în afara limitelor primește valoare lipsă; include_lowest=True include prima limită.

Dacă bins este un număr (de exemplu 3), pandas împarte intervalul dintre minim și maxim în 3 bucăți de lungime egală. Pentru grupe cu același număr de valori folosește pd.qcut().

Parametri

Parametru Descriere
x Valorile de împărțit: o listă sau o Series de numere.
bins Lista limitelor sau numărul de intervale egale.
labels Numele intervalelor (câte unul pentru fiecare interval) sau False pentru numere 0, 1, 2…
right True (implicit): limita din dreapta face parte din interval. False: limita din stânga.
include_lowest True: prima limită face parte din primul interval.

Ce returnează

O Series de tip category (pentru o Series la intrare), cu categoriile în ordine.

Exemple

Exemplul 1: Grupe de vârstă cu etichete

import pandas as pd

clienti = pd.DataFrame({"nume": ["Ana", "Mihai", "Elena", "Ioana", "Radu"],
                        "varsta": [16, 25, 34, 52, 30]})
clienti["grupa"] = pd.cut(clienti["varsta"], bins=[0, 18, 30, 50, 100],
                          labels=["minor", "tânăr", "adult", "senior"])
print(clienti)
print(clienti["grupa"].value_counts(sort=False))

Rezultat

    nume  varsta   grupa
0    Ana      16   minor
1  Mihai      25   tânăr
2  Elena      34   adult
3  Ioana      52  senior
4   Radu      30   tânăr
grupa
minor     1
tânăr     2
adult     1
senior    1
Name: count, dtype: int64

Exemplul 2: right=False pentru calificative

Cu right=False, nota 5 intră în [5, 7), adică „suficient”, iar 7 intră în intervalul următor.

import pandas as pd

note = pd.Series([4, 5, 6.5, 7, 9, 10])
calificativ = pd.cut(note, bins=[1, 5, 7, 9, 10.01], right=False,
                     labels=["insuficient", "suficient", "bine", "foarte bine"])
print(pd.DataFrame({"nota": note, "calificativ": calificativ}))

Rezultat

   nota  calificativ
0   4.0  insuficient
1   5.0    suficient
2   6.5    suficient
3   7.0         bine
4   9.0  foarte bine
5  10.0  foarte bine

Exemplul 3: Intervale egale cu bins=3

import pandas as pd

preturi = pd.Series([10, 25, 40, 55, 70, 90])
print(pd.cut(preturi, bins=3))

Rezultat

0      (9.92, 36.667]
1      (9.92, 36.667]
2    (36.667, 63.333]
3    (36.667, 63.333]
4      (63.333, 90.0]
5      (63.333, 90.0]
dtype: category
Categories (3, interval[float64, right]): [(9.92, 36.667] < (36.667, 63.333] <
                                           (63.333, 90.0]]

Greșeli frecvente

  • O valoare egală cu prima limită (de exemplu 0 în bins=[0, 18, ...]) primește NaN, pentru că primul interval este (0, 18]. Adaugă include_lowest=True.
  • Dai un număr de etichete diferit de numărul de intervale. Cu 5 limite ai 4 intervale, deci 4 etichete; altfel apare ValueError.
  • Te aștepți ca grupele să aibă număr egal de valori. cut folosește limitele tale; pentru grupe egale ca număr folosește qcut.

Comenzi înrudite

  • pd.qcut(): Împarte valorile în grupe cu același număr de elemente, după cuantile: q=4 dă cuartile, q=10 dă decile.
  • 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.
  • DataFrame.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.
  • DataFrame.astype() și pd.to_numeric(): Schimbă tipul unei coloane (int, float, category, str); pd.to_numeric transformă textul în numere și poate pune NaN la valorile greșite.