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").crosstabvrea seriile:df["oras"],df["produs"]. - Dai
valuesfărăaggfunc(sau invers) și primeștiValueError: cele două se folosesc numai împreună. - Confunzi
normalize=True(proporții din totalul general) cunormalize="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.
Î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.