pd.pivot_table() în pandas

Grupare și agregare pandas 1.0+

Creează un tabel pivot ca în Excel: rânduri după o coloană, coloane după alta și o valoare agregată (sumă, medie) în fiecare celulă.

Sintaxă
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=True, sort=True)
df.pivot_table(values=None, index=None, columns=None, aggfunc='mean', ...)

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 values cu aggfunc implicit (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ști ValueError. 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.