Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

pd.crosstab() în pandas

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.

Sintaxă
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)

Ce face pd.crosstab()

pd.crosstab() construiește un tabel de frecvențe: pe rânduri valorile unei coloane, pe coloane valorile alteia, iar în fiecare celulă numărul de rânduri care au acea combinație. Exemplu: câte comenzi de fiecare produs au venit din fiecare oraș.

Spre deosebire de pivot_table, primește direct coloanele (serii), nu numele lor: pd.crosstab(df["oras"], df["produs"]). Cu normalize obții proporții în loc de numărări, iar cu values și aggfunc poți aduna o altă coloană în loc să numeri.

Parametri

Parametru Descriere
index Valorile care devin rânduri (o serie sau o listă de serii).
columns Valorile care devin coloane.
values, aggfunc Opționale, dar se dau împreună: coloana de agregat și funcția ("sum", "mean"). Fără ele, se numără aparițiile.
normalize True sau "all": proporții din total; "index": proporții pe fiecare rând; "columns": pe fiecare coloană.
margins Cu True adaugă totaluri pe rânduri și coloane (numele implicit "All", schimbat cu margins_name).
rownames, colnames Nume pentru axele rândurilor și coloanelor, dacă vrei altele decât numele seriilor.

Ce returnează

Un DataFrame cu numărări (sau proporții ori valori agregate) pentru fiecare combinație.

Exemple

Exemplul 1: Câte comenzi pe oraș și produs

Fiecare celulă spune de câte ori apare perechea oraș + produs. Combinațiile care nu apar au 0.

import pandas as pd

df = pd.DataFrame({
    "oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași", "Cluj"],
    "produs": ["laptop", "telefon", "telefon", "laptop", "telefon", "laptop", "laptop"],
})

print(pd.crosstab(df["oras"], df["produs"]))

Rezultat

produs  laptop  telefon
oras                   
Brașov       1        0
Cluj         1        2
Iași         2        1

Exemplul 2: Proporții pe rând și totaluri

Cu normalize="index" fiecare rând însumează 1: în Iași, două treimi din comenzi sunt laptopuri. Al doilea tabel adaugă totalurile cu margins=True.

import pandas as pd

df = pd.DataFrame({
    "oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași", "Cluj"],
    "produs": ["laptop", "telefon", "telefon", "laptop", "telefon", "laptop", "laptop"],
})

print(pd.crosstab(df["oras"], df["produs"], normalize="index").round(2))
print()
print(pd.crosstab(df["oras"], df["produs"], margins=True, margins_name="Total"))

Rezultat

produs  laptop  telefon
oras                   
Brașov    1.00     0.00
Cluj      0.33     0.67
Iași      0.67     0.33

produs  laptop  telefon  Total
oras                          
Brașov       1        0      1
Cluj         1        2      3
Iași         2        1      3
Total        4        3      7

Exemplul 3: Suma vânzărilor în loc de numărare

Cu values și aggfunc="sum" celulele conțin totalul în lei. Combinațiile lipsă ies NaN, deci le completezi cu fillna(0).

import pandas as pd

df = pd.DataFrame({
    "oras": ["Iași", "Cluj", "Iași", "Brașov", "Cluj", "Iași", "Cluj"],
    "produs": ["laptop", "telefon", "telefon", "laptop", "telefon", "laptop", "laptop"],
    "suma": [4200, 2100, 1800, 3900, 2500, 4100, 4500],
})

tabel = pd.crosstab(df["oras"], df["produs"], values=df["suma"], aggfunc="sum")
print(tabel.fillna(0))

Rezultat

produs  laptop  telefon
oras                   
Brașov  3900.0      0.0
Cluj    4500.0   4600.0
Iași    8300.0   1800.0

Greșeli frecvente

  • Dai numele coloanelor ca text: pd.crosstab("oras", "produs"). crosstab vrea seriile: df["oras"], df["produs"].
  • Dai values fără aggfunc (sau invers) și primești ValueError: cele două se folosesc numai împreună.
  • Confunzi normalize=True (proporții din totalul general) cu normalize="index" (proporții pe fiecare rând).

Comenzi înrudite

  • 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.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: pd.crosstab()

Ai o nelămurire despre utilizarea comenzii pd.crosstab() 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.