NumPy dan pandas sering muncul berdampingan dalam satu skrip, dan keduanya memang berhubungan erat. NumPy menyediakan array multidimensi yang cepat untuk perhitungan angka, sedangkan pandas menyediakan tabel berlabel untuk data dunia nyata. Karena sintaks operasi keduanya mirip, pemula kadang sulit menentukan kapan masing-masing lebih tepat dipakai. Chapter ini membandingkan pandas dan NumPy dari sisi struktur data, orientasi akses, tipe data, dan penanganan nilai kosong.

Perbedaan Struktur Data #

Struktur inti NumPy adalah ndarray: array N-dimensi yang seluruh isinya bertipe sama. Struktur inti pandas adalah Series (satu dimensi berlabel) dan DataFrame (dua dimensi berlabel), yang di dalamnya memakai array NumPy sebagai penyimpanan. Perbedaan paling menonjol adalah pandas menyimpan label pada baris dan kolom, sedangkan ndarray hanya mengenal posisi. Tabel berikut meringkas perbedaannya:

AspekNumPy ndarraypandas Series / DataFrame
LabelTidak ada; akses lewat posisi integerAda index dan columns
Tipe dataSatu dtype untuk seluruh isiSatu dtype per kolom
Nilai kosongnp.nan menyebar ke hasil perhitunganFitur bawaan (isna, fillna, dropna)
Isi campuranTidak lazim; dtype turun menjadi objectNormal; teks, angka, tanggal berdampingan
Operasi andalanAljabar linear, broadcastinggroupby, merge, pivot_table
Format baca-tulisBerkas biner .npyCSV, Excel, Parquet, SQL, JSON, dan lainnya

Orientasi Posisi vs Orientasi Label #

NumPy mengakses data dengan posisi: arr[2] berarti elemen ketiga, dan arr[:, 1] berarti kolom kedua. pandas memungkinkan akses berbasis label: ser["Rab"] langsung menunjuk baris berlabel Rab tanpa perlu mengingat urutannya. Ketika kolom ditambahkan atau disusun ulang, kode berbasis label tetap benar, sedangkan kode berbasis posisi rawan meleset tanpa terdeteksi. Label juga membuat hasil agregasi bisa langsung dibaca, karena setiap angka membawa nama grupnya.

Perbedaan Penanganan Nilai Kosong #

Kedua library memakai np.nan untuk nilai kosong pada data numerik, tetapi konsekuensinya berbeda. Di NumPy, satu np.nan membuat hasil arr.mean() menjadi nan, kecuali kita memanggil fungsi khusus seperti np.nanmean(). pandas mengambil jalur sebaliknya: method statistik seperti mean() dan sum() mengabaikan nilai kosong secara default lewat parameter skipna=True. Karena data dunia nyata hampir selalu punya sel kosong, perilaku default pandas lebih sering sesuai kebutuhan analisis.

Perbedaan Tipe Data #

Satu ndarray hanya boleh memiliki satu dtype, sehingga array campuran teks dan angka dipaksa turun menjadi object dan kehilangan kecepatan. DataFrame menyimpan setiap kolom secara terpisah, sehingga kolom harga bisa int64 sementara kolom produk tetap teks. Sejak pandas 3.0, kolom teks bertipe str secara default, bukan object seperti pada pandas 1.x dan 2.x; detail perubahannya dijelaskan pada panduan migrasi string 3.0 dan catatan rilis v3.0.0 .

Contoh: Masalah yang Sama, Dua Pendekatan #

Skrip berikut menunjukkan tiga perbedaan di atas sekaligus: perilaku mean() terhadap NaN, akses berbasis label, dan dtype per kolom.

python
import numpy as np
import pandas as pd

penjualan_np = np.array([120, 135, np.nan, 150, 160])
print("NumPy :", penjualan_np.mean())

penjualan_pd = pd.Series(penjualan_np, index=["Sen", "Sel", "Rab", "Kam", "Jum"])
print("pandas:", penjualan_pd.mean())
print()

print("Nilai hari Rab:", penjualan_pd["Rab"])
print()

stok = pd.DataFrame({
    "produk": ["Kopi Gayo", "Teh Melati"],
    "harga": [85000, 32000],
})
print(stok.dtypes)

Output yang Dihasilkan:

text
NumPy : nan
pandas: 141.25

Nilai hari Rab: nan

produk      str
harga     int64
dtype: object

Mari kita telaah baris demi baris:

  1. Baris 4 (np.array([120, 135, np.nan, 150, 160])): satu elemen np.nan membuat seluruh array bertipe float64; ndarray tidak punya cara mengisolasi nilai kosong itu.
  2. Baris 5 vs 8 (mean()): NumPy mengembalikan nan karena NaN ikut terhitung, sedangkan Series pandas mengembalikan 141.25 karena NaN diabaikan secara default.
  3. Baris 11 (penjualan_pd["Rab"]): akses berbasis label; dengan ndarray kita harus tahu bahwa Rab berada pada posisi ke-2.
  4. Baris 14-18 (stok.dtypes): DataFrame menyimpan kolom produk sebagai str dan kolom harga sebagai int64; ndarray tunggal tidak mampu menyimpan kombinasi tersebut tanpa kehilangan tipe.

Kapan Memakai NumPy, Kapan Memakai pandas #

Pekerjaan murni numerik tanpa label, seperti operasi matriks, aljabar linear, dan pengolahan sinyal, berada di wilayah NumPy. Begitu data berbentuk tabel dengan header kolom, tipe campuran, nilai kosong, atau perlu dibaca dari berkas, pandas lebih tepat. Dalam praktiknya keduanya dipakai bersama: pandas mengurus bagian tabel, NumPy mengurus perhitungan array di dalamnya. Aturan praktisnya, mulai dari pandas dan turun ke NumPy saat operasi tertentu membutuhkan fungsi array khusus, sebagaimana dirangkum di dokumentasi NumPy dan Essential basic functionality .

NumPy baru satu anggota ekosistem data Python, dan banyak dari kita membawa bekal alat lain saat bertemu pandas. Dua chapter berikutnya memetakan pengetahuan lama itu: padanan query SQL, lalu padanan spreadsheet, sebelum gambaran besar ekosistem menyusul.