Ce face pd.pivot_table()
pivot_table() face ce face un PivotTable din Excel: valorile unei coloane devin rânduri (index), valorile altei coloane devin coloane (columns), iar în fiecare celulă se pune rezultatul unei agregări (aggfunc) pe coloana values.
Atenție: funcția implicită este "mean" (media), nu suma. Pentru totaluri scrie explicit aggfunc="sum". Combinațiile care nu apar în date ies NaN; cu fill_value=0 le înlocuiești cu zero, iar margins=True adaugă un rând și o coloană de totaluri.
Funcția există în două forme echivalente: pd.pivot_table(df, ...) și df.pivot_table(...). Spre deosebire de pivot(), acceptă combinații repetate, pentru că le agregă.
Parametri
| Parametru | Descriere |
|---|---|
values |
Coloana (sau lista de coloane) care se agregă. |
index |
Coloana ale cărei valori devin rândurile tabelului. |
columns |
Coloana ale cărei valori devin coloanele tabelului. |
aggfunc |
Funcția de agregare: implicit "mean". Poate fi "sum", "count", "max", o listă de funcții sau un dicționar {coloană: funcție}. |
fill_value |
Valoarea pusă în celulele fără date (în loc de NaN). |
margins |
Cu True adaugă totaluri pe rânduri și coloane, calculate cu aceeași aggfunc. |
margins_name |
Numele rândului și coloanei de totaluri. Implicit "All". |
dropna |
Implicit True: nu include coloanele care au doar valori lipsă. |
Ce returnează
Un DataFrame nou, cu valorile din index pe rânduri și cele din columns pe coloane.
Exemple
Exemplul 1: Vânzări pe oraș și lună
Orașele devin rânduri, lunile devin coloane, iar în celule este suma vânzărilor. Brașov nu are vânzări în februarie, deci celula iese NaN.
import pandas as pd
df = pd.DataFrame({
"oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași", "Cluj"],
"luna": ["2026-01", "2026-01", "2026-02", "2026-01", "2026-02", "2026-01", "2026-02"],
"suma": [1200, 800, 450, 900, 1500, 300, 700],
})
tabel = pd.pivot_table(df, index="oras", columns="luna", values="suma", aggfunc="sum")
print(tabel)
Rezultat
luna 2026-01 2026-02
oras
Brașov 900.0 NaN
Cluj 800.0 2200.0
Iași 1500.0 450.0
Exemplul 2: Zero în loc de NaN și totaluri
fill_value=0 completează celula goală, iar margins=True adaugă rândul și coloana Total (numele vine din margins_name).
import pandas as pd
df = pd.DataFrame({
"oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași", "Cluj"],
"luna": ["2026-01", "2026-01", "2026-02", "2026-01", "2026-02", "2026-01", "2026-02"],
"suma": [1200, 800, 450, 900, 1500, 300, 700],
})
tabel = df.pivot_table(
index="oras", columns="luna", values="suma",
aggfunc="sum", fill_value=0, margins=True, margins_name="Total",
)
print(tabel)
Rezultat
luna 2026-01 2026-02 Total
oras
Brașov 900 0 900
Cluj 800 2200 3000
Iași 1500 450 1950
Total 3200 2650 5850
Exemplul 3: Altă funcție pe fiecare coloană
Fără columns, tabelul pivot seamănă cu un groupby. Dicționarul din aggfunc adună suma și calculează media bucăților.
import pandas as pd
df = pd.DataFrame({
"oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași"],
"suma": [1200, 800, 450, 900, 1500, 300],
"bucati": [4, 2, 1, 3, 5, 2],
})
tabel = df.pivot_table(index="oras", values=["suma", "bucati"],
aggfunc={"suma": "sum", "bucati": "mean"})
print(tabel)
Rezultat
bucati suma
oras
Brașov 3.000000 900
Cluj 3.500000 2300
Iași 2.333333 1950
Greșeli frecvente
- Uiți de
aggfuncși te miri că numerele sunt mai mici decât totalul: implicit se calculează media, nu suma. - Pui o coloană de text în
valuescuaggfuncimplicit (media). Pentru text folosește"count","first"sau alege doar coloane numerice. - Folosești
pivot()când există combinații repetate oraș + lună și primeștiValueError.pivot_table()le agregă.
Comenzi înrudite
DataFrame.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.pd.crosstab(): Numără de câte ori apare fiecare combinație de valori din două coloane și le pune într-un tabel cu rânduri și coloane.DataFrame.pivot(): Rearanjează un tabel lung într-unul lat: valorile unei coloane devin nume de coloane, fără calcule de agregare.pd.melt() / DataFrame.melt(): Transformă un tabel lat (o coloană pe lună) într-unul lung, cu un rând pentru fiecare combinație și o coloană de valori.agg() / aggregate(): Aplică mai multe funcții de agregare deodată, diferite pe coloane, cu nume alese de tine pentru coloanele rezultatului.