Chapter sebelumnya menyentuh dictionary sekilas sebagai salah satu sumber pd.DataFrame(). Kali ini kita bedah varian dictionary secara tuntas, karena dua varian berbeda berperilaku sangat berbeda: dict of lists dan dict of Series. Pada dict of lists, kita menyerahkan daftar nilai polos dan wajib mematuhi satu aturan keras soal panjang. Pada dict of Series, setiap kolom membawa index sendiri sehingga pandas harus menyelaraskannya terlebih dahulu. Memahami keduanya membuat kita tahu persis apa yang terjadi saat tabel tidak terbentuk sebagaimana mestinya.

Dict of Lists dan Aturan Panjang yang Sama #

Pada pola dict of lists, setiap key menjadi nama kolom dan setiap list menjadi isi kolom tersebut. Panjang semua list dalam satu dictionary harus sama, karena setiap list dianggap satu kolom yang sejajar pada index baris yang sama. Bila salah satu list lebih pendek, pandas tidak menebak bagian yang hilang; konstruktor langsung menolak pembuatan tabel.

python
import pandas as pd

penjualan = pd.DataFrame({
    "kasir": ["Budi", "Siti", "Dewi"],
    "kota": ["Bandung", "Jakarta", "Surabaya"],
    "qty": [12, 8, 15],
})
print(penjualan)
print()

stok = pd.Series({"Apel Fuji": 45, "Jeruk Baby": 120}, name="stok")
harga = pd.Series(
    {"Apel Fuji": 32000, "Jeruk Baby": 18000, "Duku Palembang": 25000},
    name="harga",
)
gabungan = pd.DataFrame({"stok": stok, "harga": harga})
print(gabungan)
print()

try:
    pd.DataFrame({"qty": [12, 8, 15], "kota": ["Bandung", "Jakarta"]})
except ValueError as e:
    print("Gagal dibuat ->", type(e).__name__, ":", e)

Output yang Dihasilkan:

text
  kasir      kota  qty
0  Budi   Bandung   12
1  Siti   Jakarta    8
2  Dewi  Surabaya   15

                 stok  harga
Apel Fuji        45.0  32000
Duku Palembang    NaN  25000
Jeruk Baby      120.0  18000

Gagal dibuat -> ValueError : All arrays must be of the same length

Mari kita telaah bagian per bagian:

  1. Baris 3-7 (penjualan = pd.DataFrame({...})): ketiga list sama panjang (3), sehingga DataFrame terbentuk dengan RangeIndex 0 sampai 2. Baris 0 selalu terdiri atas Budi, Bandung, dan 12, karena posisi pada setiap list menandai baris yang sama.
  2. Baris 11-15 (dua Series dengan isi berbeda): stok memiliki 2 label, sedangkan harga memiliki 3 label. Konstruktor menggabungkan kedua index menjadi satu himpunan label.
  3. Baris 16-17 (gabungan): tabel hasil memuat tiga baris label, dan baris Duku Palembang berisi NaN pada kolom stok karena label itu tidak ada di Series stok.
  4. Baris 20-23 (blok try/except): kita sengaja memberi list qty 3 nilai dan list kota 2 nilai. Pandas menolaknya dengan ValueError: All arrays must be of the same length, dan program kita menangkapnya agar output tetap rapi.

Dict of Series dan Penyelarasan Index #

Perbedaan mendasar terletak pada index. Sebuah Series membawa index sendiri, dan bila kita menyusun DataFrame dari beberapa Series, pandas menyatukan semua label index tersebut. Proses ini disebut alignment atau penyelarasan: baris yang labelnya ada di semua Series akan terisi penuh, sedangkan baris yang labelnya hanya ada di sebagian Series diisi NaN pada kolom sisanya.

Perhatikan output bagian kedua di atas. Label gabungannya berurut secara alfabet: Apel Fuji, Duku Palembang, Jeruk Baby; urutan ini berasal dari proses penyatuan label, bukan dari urutan penulisan kita. Kolom stok juga berubah menjadi float64, karena kolom itu kini memuat NaN di samping angka bulat, sama seperti kasus NaN pada chapter sebelumnya.

Dengan dictionary, kita memberi label kolom lewat key dan label baris mengikuti index sumber. Kedua pola pembuatan ini diuraikan resmi pada halaman intro to data structures , yang juga memuat contoh-contoh lanjutan untuk dibaca santai. Namun banyak data praktis datang tanpa label sama sekali: sekadar deret baris dalam list, atau blok angka dalam array NumPy. Chapter berikutnya menangani sumber-sumber tanpa label itu dan menunjukkan cara memberi nama kolomnya secara manual.