Ce face DataFrame.groupby()
groupby() pune la un loc rândurile care au aceeași valoare într-o coloană (de exemplu același oraș) și îți permite să calculezi ceva pentru fiecare grup: suma, media, numărul de rânduri. Este echivalentul lui GROUP BY din SQL.
Singur, df.groupby("oras") nu calculează nimic: returnează un obiect DataFrameGroupBy. Rezultatul apare abia când alegi coloana și funcția, de exemplu df.groupby("oras")["suma"].sum(). Funcțiile folosite des sunt sum(), mean(), min(), max(), count() (valorile nelipsă) și size() (toate rândurile, inclusiv cele cu valori lipsă).
Implicit, valorile după care grupezi devin indexul rezultatului și sunt sortate. Cu as_index=False rămân coloane obișnuite, ceea ce e comod când vrei să continui cu rezultatul ca tabel sau să-l salvezi în CSV.
Parametri
| Parametru | Descriere |
|---|---|
by |
Numele coloanei după care grupezi sau o listă de coloane (["oras", "luna"]). Poate fi și o serie sau o funcție aplicată pe index. |
level |
Grupează după un nivel al indexului (util la un MultiIndex), în loc de o coloană. |
as_index |
Implicit True: cheile de grupare devin index. Cu False rămân coloane în rezultat. |
sort |
Implicit True: grupurile apar sortate după cheie. Cu False apar în ordinea primei apariții. |
dropna |
Implicit True: rândurile cu cheia lipsă (NaN) sunt ignorate. Cu False formează un grup separat. |
observed |
Contează doar pentru coloane category: implicit (True) apar doar categoriile care există în date. |
Ce returnează
Un obiect DataFrameGroupBy (sau SeriesGroupBy după ce alegi o coloană). Funcțiile de agregare aplicate pe el returnează o Series sau un DataFrame cu un rând pe grup.
Exemple
Exemplul 1: Totalul și media vânzărilor pe oraș
Alegi coloana suma din grupuri și calculezi suma și media pentru fiecare oraș. Orașele apar sortate alfabetic, ca index.
import pandas as pd
df = pd.DataFrame({
"oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași"],
"vanzator": ["Ana", "Mihai", "Ioana", "Radu", "Mihai", "Ana"],
"suma": [1200, 800, 450, 900, 1500, 300],
})
print(df.groupby("oras")["suma"].sum())
print()
print(df.groupby("oras")["suma"].mean())
Rezultat
oras
Brașov 900
Cluj 2300
Iași 1950
Name: suma, dtype: int64
oras
Brașov 900.0
Cluj 1150.0
Iași 650.0
Name: suma, dtype: float64
Exemplul 2: Grupare după două coloane, cu as_index=False
Cu o listă de coloane primești un rând pentru fiecare combinație oraș + vânzător. as_index=False păstrează cheile ca și coloane, deci rezultatul arată ca un tabel obișnuit.
import pandas as pd
df = pd.DataFrame({
"oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași"],
"vanzator": ["Ana", "Mihai", "Ioana", "Radu", "Mihai", "Ana"],
"suma": [1200, 800, 450, 900, 1500, 300],
})
total = df.groupby(["oras", "vanzator"], as_index=False)["suma"].sum()
print(total)
print(type(total).__name__)
Rezultat
oras vanzator suma
0 Brașov Radu 900
1 Cluj Mihai 2300
2 Iași Ana 1500
3 Iași Ioana 450
DataFrame
Exemplul 3: Diferența dintre size() și count()
Clasa 9A are două rânduri, dar o notă lipsește. size() numără rândurile (2), count() numără doar notele existente (1). Media ignoră valoarea lipsă.
import pandas as pd
df = pd.DataFrame({
"clasa": ["9A", "9A", "9B", "9B", "9B"],
"nota": [9, None, 7, 10, 8],
})
g = df.groupby("clasa")
print(g.size())
print()
print(g["nota"].count())
print()
print(g["nota"].mean())
Rezultat
clasa
9A 2
9B 3
dtype: int64
clasa
9A 1
9B 3
Name: nota, dtype: int64
clasa
9A 9.000000
9B 8.333333
Name: nota, dtype: float64
Greșeli frecvente
- Aștepți un rezultat de la
df.groupby("oras")singur. Afișarea lui arată doar<pandas.api.typing.DataFrameGroupBy object at 0x...>: trebuie să alegi o funcție (sum(),mean(),agg()). - Calculezi
mean()pe tot grupul când tabelul are și coloane de text. Media pe coloanestrdăTypeError: alege întâi coloanele numerice (df.groupby("oras")["suma"].mean()) sau foloseștenumeric_only=True. - Confunzi
count()cusize():count()nu numără valorile lipsă, deci poate da numere diferite pe coloane diferite. - Uiți că, după grupare, cheile sunt în index.
rezultat["oras"]dăKeyError; foloseșteas_index=Falsesaureset_index().
Comenzi înrudite
agg() / aggregate(): Aplică mai multe funcții de agregare deodată, diferite pe coloane, cu nume alese de tine pentru coloanele rezultatului.groupby().transform(): Calculează o valoare pe grup (suma, media) și o pune înapoi pe fiecare rând, ca să o poți folosi ca o coloană nouă.pd.pivot_table(): Creează un tabel pivot ca în Excel: rânduri după o coloană, coloane după alta și o valoare agregată (sumă, medie) în fiecare celulă.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.set_index() / reset_index(): set_index face dintr-o coloană indexul rândurilor; reset_index mută indexul înapoi într-o coloană sau îl renumerotează.
Întrebări & Exemple de Cod:
DataFrame.groupby()Ai o nelămurire despre utilizarea comenzii
DataFrame.groupby()sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.