Semua pekerjaan pandas bermuara pada dua struktur data: Series dan DataFrame. Series adalah satu kolom berlabel, sedangkan DataFrame adalah tabel lengkap yang menggabungkan beberapa Series di bawah satu index yang sama. Mengenal anatomi keduanya sejak awal membuat setiap method pandas pada section berikutnya terasa masuk akal, bukan sekadar hafalan. Chapter ini membahas definisi, komponen penyusun, dan contoh pembuatan keduanya.
Series: Satu Kolom Berlabel #
Series adalah array satu dimensi yang setiap elemennya punya label dari index. Bentuknya mirip satu kolom spreadsheet: data bertipe sama, dengan penanda baris di sisi kiri. Kita membuatnya dengan pd.Series(data, index=...); bila index tidak diberikan, pandas memberi label integer mulai dari nol. Contoh berikut menyimpan harga tiga produk dengan nama produk sebagai labelnya.
import pandas as pd
harga = pd.Series(
[85000, 32000, 24000],
index=["Kopi Gayo", "Teh Melati", "Gula Aren"],
)
print(harga)
print()
print("index :", harga.index.tolist())
print("dtype :", harga.dtype)
print("nilai :", harga.to_numpy().tolist())Output yang Dihasilkan:
Kopi Gayo 85000
Teh Melati 32000
Gula Aren 24000
dtype: int64
index : ['Kopi Gayo', 'Teh Melati', 'Gula Aren']
dtype : int64
nilai : [85000, 32000, 24000]Mari kita telaah baris demi baris:
- Baris 3-6 (
pd.Series(...)): argumen pertama adalah list nilai, argumen kedua adalah list label; pasangan nilai dan label inilah yang membedakan Series dari list biasa. - Baris 8-10:
print(harga)menampilkan pasangan label-nilai laluindex.tolist()menampilkan daftar label sebagai list Python. - Baris 11 (
harga.dtype): seluruh nilai berbagi satu tipe, yaituint64; Series bersifat homogen. - Baris 12 (
to_numpy().tolist()): label ditinggalkan dan kita menerima nilai murni, persis seperti mengambil data dari array biasa.
DataFrame: Tabel Lengkap #
DataFrame adalah tabel dua dimensi: barisnya berlabel index, kolomnya bernama columns. Cara pembuatan yang paling umum adalah dictionary of lists, di mana setiap key menjadi nama kolom dan setiap value menjadi isinya. Contoh berikut membangun tabel stok dengan label baris kustom P1, P2, dan P3.
import pandas as pd
stok = pd.DataFrame(
{
"produk": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
"harga": [85000, 32000, 24000],
"stok": [12, 30, 25],
},
index=["P1", "P2", "P3"],
)
print(stok)
print()
print("index :", stok.index.tolist())
print("columns:", stok.columns.tolist())
print("shape :", stok.shape)Output yang Dihasilkan:
produk harga stok
P1 Kopi Gayo 85000 12
P2 Teh Melati 32000 30
P3 Gula Aren 24000 25
index : ['P1', 'P2', 'P3']
columns: ['produk', 'harga', 'stok']
shape : (3, 3)Mari kita telaah baris demi baris:
- Baris 3-10 (
pd.DataFrame({...})): setiap key dictionary menjadi nama kolom, dan panjang listnya menentukan jumlah baris. - Baris 9 (
index=["P1", "P2", "P3"]): label baris diganti dari angka otomatis menjadi kode produk, sehinggastok.loc["P1"]nantinya langsung menunjuk baris pertama. - Baris 14-15 (
indexdancolumns): DataFrame menyimpan dua halaman label, satu untuk baris dan satu untuk kolom. - Baris 16 (
shape):(3, 3)berarti tiga baris dan tiga kolom; atribut ini sering dipakai untuk memeriksa ukuran data setelah dimuat.
Anatomi index, columns, dan dtypes #
Kedua struktur memakai komponen yang sama, dengan sedikit perbedaan kepemilikan. Tabel berikut memetakannya:
| Komponen | Atribut | Dimiliki oleh |
|---|---|---|
| Label baris | .index | Series dan DataFrame |
| Nama kolom | .columns | DataFrame saja |
| Tipe data | .dtype (Series) / .dtypes (DataFrame) | keduanya |
| Ukuran | .shape | keduanya |
| Nilai murni | .to_numpy() | keduanya |
Objek index pada pandas bersifat immutable: labelnya tidak dapat diubah satu per satu, tetapi seluruh index dapat diganti dengan assignment baru. Index juga tidak harus angka; label tanggal, kode produk, dan nama kota sama-sama sah. Ketika dua tabel digabungkan, pandas mencocokkan baris lewat index atau kolom kunci, bukan lewat posisi. Prinsip pencocokan berbasis label inilah yang nantinya dipakai merge, concat, dan reindex.
Homogen vs Heterogen #
Series menuntut satu tipe data untuk seluruh nilainya, sedangkan DataFrame menyatukan kolom-kolom bertipe berbeda dalam satu tabel. Kolom teks, kolom angka, dan kolom tanggal bisa berdampingan tanpa saling mengganggu, karena setiap kolom sebenarnya adalah Series tersendiri. Sejak pandas 3.0, kolom teks bertipe str secara default dengan missing value berbentuk NaN, bukan lagi object yang menyimpan objek Python satu per satu. Rincian perubahan ini dijelaskan pada panduan migrasi string 3.0
.
Dengan dua struktur ini di tangan, pertanyaan berikutnya bukan lagi bagaimana bentuknya, melainkan kapan kita memilih pandas dibanding alat lain. Chapter berikutnya membahas kriteria pemilihan tersebut. Kedua struktur juga sudah didokumentasikan resmi pada referensi pandas.Series dan referensi pandas.DataFrame , sementara Intro to data structures menjadi bacaan pengayaan yang nyaman.