Pandas crosstab: Tabel Silang di Python (2026)
TL;DR
Pandas crosstab bikin tabel silang yang menghitung berapa kali dua kategori muncul bersamaan, dengan baris untuk satu kategori dan kolom untuk kategori lain. Sintaks dasarnya pd.crosstab(baris, kolom), dan bisa diubah jadi persen pakai argumen normalize. Tambahin values dan aggfunc kalau mau menghitung agregat, bukan sekadar frekuensi.
Pandas crosstab bikin tabel silang, yaitu tabel yang menghitung berapa kali dua kategori muncul bersamaan. Baris buat satu kategori, kolom buat kategori lain, dan tiap sel isinya jumlah data yang cocok. Cara cepat lihat hubungan antar dua kolom kategori.
Contoh gampang: kamu mau tau berapa banyak transaksi tiap kategori produk di tiap kota. Satu tabel crosstab langsung jawab itu.
Di sini aku bahas cara pakainya, dari hitung frekuensi sampai persentase. Contohnya data penjualan toko.
Apa itu crosstab di pandas?
crosstab adalah fungsi pandas yang meringkas dua kolom kategori jadi satu tabel frekuensi. Nilai unik dari kolom pertama jadi baris, nilai unik kolom kedua jadi kolom, dan tiap sel ngitung berapa baris yang punya kombinasi itu. Hasilnya mirip pivot table, tapi khusus buat hitung-hitungan cepat.
Fungsi ini pas buat pertanyaan kayak berapa pelanggan pria vs wanita di tiap kategori, atau berapa order per metode pembayaran per kota.
Gimana cara pakai pandas crosstab?
Sintaks dasarnya: pd.crosstab(baris, kolom). Argumen pertama kolom yang jadi baris, argumen kedua kolom yang jadi kolom. Pandas otomatis ngitung frekuensinya.
import pandas as pd
df = pd.read_csv('transaksi.csv')
# jumlah transaksi tiap kategori per kota
tabel = pd.crosstab(df['kota'], df['kategori'])
print(tabel)
Hasilnya matriks: tiap baris satu kota, tiap kolom satu kategori produk, dan angkanya jumlah transaksi. Sekali jalan, kamu langsung lihat sebaran datanya.
Kalau mau baris dan kolom punya total, tambahin margins=True. Pandas bakal nambahin baris dan kolom 'All' berisi subtotal.
tabel = pd.crosstab(df['kota'], df['kategori'], margins=True)
Gimana cara bikin crosstab dalam persen?
Tambahin argumen normalize buat ngubah angka jadi proporsi. normalize='index' bikin tiap baris berjumlah 1, normalize='columns' bikin tiap kolom berjumlah 1, dan normalize=True bikin total keseluruhan jadi 1.
# proporsi kategori di dalam tiap kota
pd.crosstab(df['kota'], df['kategori'], normalize='index')
| normalize | Yang dijadikan 100% | Jawab pertanyaan |
|---|---|---|
| 'index' | Tiap baris | Komposisi kategori per kota |
| 'columns' | Tiap kolom | Sebaran kota per kategori |
| True | Seluruh tabel | Porsi tiap sel dari total |
Persentase sering lebih berguna dari angka mentah. Kota besar pasti punya transaksi lebih banyak, tapi proporsinya yang nunjukin pola beli.
Bisa gak crosstab menghitung selain frekuensi?
Bisa. Tambahin argumen values dan aggfunc biar crosstab ngitung agregat, bukan sekadar jumlah baris. Misalnya rata-rata nominal belanja tiap kombinasi.
# rata-rata omzet tiap kategori per kota
pd.crosstab(
df['kota'], df['kategori'],
values=df['omzet'], aggfunc='mean'
)
Di titik ini crosstab jalan mirip pivot_table. Bedanya crosstab lebih ringkas buat kasus hitung frekuensi, sementara pivot_table lebih fleksibel buat agregasi rumit.
Contoh kasus: kategori produk per kota toko_berkah
toko_berkah jualan online ke 5 kota dan punya 4 kategori produk. Mereka mau tau kota mana yang belanjanya condong ke kategori mana, biar stok dan promo lebih tepat sasaran.
tabel = pd.crosstab(
df['kota'], df['kategori'],
normalize='index'
).round(2)
print(tabel)
Dari dataset ngulikdata, hasilnya nunjukin satu pola menarik: di Surabaya, kategori sembako nyumbang 61% dari transaksi, jauh di atas rata-rata kota lain yang cuma 38%. Sementara di Jakarta, kategori peralatan rumah justru mendominasi dengan 44%. Insight ini bikin tim bisa geser alokasi stok tanpa nebak-nebak.
Tanpa crosstab, pola kayak gini kependam di ribuan baris transaksi. Satu tabel silang bikin perbedaan antar kota langsung kelihatan.
Kesalahan umum pakai crosstab
- Ketuker urutan baris dan kolom. Argumen pertama jadi baris, kedua jadi kolom. Kalau kebalik, tabelnya jadi transposisi yang bikin bingung.
- Lupa normalize pas mau persen. Tanpa itu, kamu dapat angka mentah. Bandingin kota besar dan kecil jadi gak adil.
- Salah pilih arah normalize. 'index' dan 'columns' jawab pertanyaan yang beda. Pikirin dulu mau 100% ke arah mana.
- Ada nilai NaN di kolom kategori. Baris dengan kategori kosong bakal keluar dari hitungan. Bersihin atau isi dulu NaN-nya.
Kalau kategorimu banyak banget, tabelnya jadi lebar dan susah dibaca. Pertimbangin gabungin kategori kecil jadi 'lainnya' dulu sebelum bikin crosstab.
FAQ
Apa bedanya crosstab dan pivot_table di pandas?
crosstab dirancang khusus buat hitung frekuensi antar kategori dan sintaksnya lebih ringkas buat kasus itu. pivot_table lebih umum dan fleksibel, cocok buat agregasi rumit dengan banyak kolom nilai. Buat sekadar hitung berapa kali dua kategori muncul bareng, pakai crosstab. Buat ringkasan angka yang lebih kompleks, pivot_table lebih pas.
Gimana cara menampilkan crosstab dalam persen?
Tambahin argumen normalize. Pakai normalize='index' kalau mau tiap baris berjumlah 100%, normalize='columns' kalau mau tiap kolom 100%, atau normalize=True buat proporsi dari total keseluruhan. Kalikan hasilnya dengan 100 dan bulatkan pakai .round(1) biar lebih gampang dibaca. Persentase bikin perbandingan antar kelompok jadi adil.
Bisa gak crosstab pakai tiga kolom atau lebih?
Bisa. Kamu bisa kasih daftar kolom di argumen baris atau kolom, misalnya pd.crosstab([df['kota'], df['gender']], df['kategori']). Hasilnya tabel dengan index bertingkat. Tapi hati-hati, makin banyak kolom, tabelnya makin lebar dan susah dibaca. Buat kombinasi tiga dimensi atau lebih, kadang pivot_table lebih rapi.
Kenapa ada baris atau kolom yang hilang di crosstab?
Biasanya karena nilai di kolom itu NaN, jadi pandas gak masukin ke hitungan. Cek dulu pakai df.isna().sum() buat lihat kolom mana yang punya nilai kosong. Isi NaN pakai fillna dengan label kayak 'tidak diketahui', atau buang barisnya kalau memang gak relevan. Setelah bersih, semua kategori bakal muncul di tabel.
Gimana cara menghitung rata-rata, bukan frekuensi, di crosstab?
Isi argumen values dengan kolom angka dan aggfunc dengan fungsi agregat. Misalnya pd.crosstab(df['kota'], df['kategori'], values=df['omzet'], aggfunc='mean') ngitung rata-rata omzet tiap kombinasi. Kamu bisa ganti 'mean' jadi 'sum', 'max', atau fungsi lain sesuai kebutuhan. Di mode ini crosstab jalan mirip pivot_table.
Penutup
Rangkuman: crosstab bikin tabel silang buat hitung frekuensi antar dua kategori. Tambahin normalize buat persen, dan values plus aggfunc buat agregat selain jumlah.
Coba ambil dua kolom kategori di datamu, bikin crosstab-nya, dan lihat pola yang selama ini gak keliatan.
Mau lanjut olah data pandas? Baca cara bikin pivot di Python pakai pivot_table dan cara hitung frekuensi nilai pakai value_counts. Buat konsep dasarnya, cek glosarium tabel silang dan glosarium pivot table. Dokumentasi resmi ada di halaman pandas.crosstab.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.