Array NumPy dari chapter Dasar NumPy cepat, tetapi tetap miskin: kolom tanpa nama, baris tanpa identitas, dan file CSV tanpa tipe angka. pandas menutup semua celah itu dengan dua struktur berlabel — Series dan DataFrame — yang dibangun langsung di atas ndarray. Chapter ini memperkenalkan keduanya, membaca file CSV sungguhan, dan menyiapkan alur kerja yang akan dipakai sepanjang sisa section.

Dua Struktur Inti: Series dan DataFrame #

Model mentalnya sederhana: Series adalah satu kolom berlabel, DataFrame adalah tabel berisi banyak Series. Membuat Series tanpa label menghasilkan indeks angka otomatis:

python
import pandas as pd

harga = pd.Series([150000, 99000, 750000, 250000, 350000])
print(harga)
print()
print("values:", harga.values)
print("index :", harga.index)
print("dtype  :", harga.dtype)

Output yang Dihasilkan:

text
0    150000
1     99000
2    750000
3    250000
4    350000
dtype: int64

values: [150000  99000 750000 250000 350000]
index : RangeIndex(start=0, stop=5, step=1)
dtype  : int64

Perhatikan bahwa harga.values adalah array NumPy — inilah bukti nyata bahwa pandas berdiri di atas NumPy. Kekuatan Series baru terasa ketika indeksnya diganti label yang bermakna:

python
import pandas as pd

harga = pd.Series(
    [150000, 99000, 750000],
    index=["Mouse Wireless", "Novel Laskar Pelangi", "Keyboard Mekanik"],
    name="harga",
)
print(harga)
print()
print(harga["Novel Laskar Pelangi"])
print(harga["Mouse Wireless":"Novel Laskar Pelangi"])

Output yang Dihasilkan:

text
Mouse Wireless          150000
Novel Laskar Pelangi     99000
Keyboard Mekanik        750000
Name: harga, dtype: int64

99000
Mouse Wireless          150000
Novel Laskar Pelangi     99000
Name: harga, dtype: int64

Sekarang harga["Novel Laskar Pelangi"] mencari berdasarkan label, bukan posisi, dan slicing harga["Mouse Wireless":"Novel Laskar Pelangi"] menyertakan kedua ujungnya — berbeda dengan slicing list Python yang memotong ujung kanan.

Dataset Latihan dan Membaca CSV #

Seluruh chapter pandangan-pertama ini memakai satu dataset ritel fiktif — 24 transaksi penjualan sepanjang Januari sampai Maret 2025 di tiga kota. Simpan teks berikut sebagai penjualan.csv:

text
tanggal,kota,kategori,produk,harga,jumlah
2025-01-03,Jakarta,Elektronik,Mouse Wireless,150000,4
2025-01-06,Bandung,Fashion,Kaos Polos,95000,6
2025-01-09,Surabaya,Buku,Novel Laskar Pelangi,99000,5
2025-01-12,Jakarta,Elektronik,Keyboard Mekanik,750000,1
2025-01-15,Bandung,Elektronik,Powerbank 10000mAh,250000,3
2025-01-18,Surabaya,Fashion,Kemeja Flanel,185000,2
2025-01-21,Jakarta,Buku,Atlas Indonesia,150000,2
2025-01-24,Bandung,Elektronik,Speaker Bluetooth,350000,2
2025-01-27,Surabaya,Elektronik,Mouse Wireless,150000,3
2025-02-01,Jakarta,Fashion,Sepatu Sneakers,450000,1
2025-02-04,Bandung,Buku,Buku Masak,120000,4
2025-02-07,Surabaya,Elektronik,Powerbank 10000mAh,250000,2
2025-02-10,Jakarta,Fashion,Kaos Polos,95000,8
2025-02-13,Bandung,Buku,Novel Laskar Pelangi,99000,3
2025-02-16,Surabaya,Elektronik,Keyboard Mekanik,750000,1
2025-02-19,Jakarta,Elektronik,Speaker Bluetooth,350000,3
2025-02-22,Bandung,Fashion,Kemeja Flanel,185000,4
2025-02-25,Surabaya,Buku,Atlas Indonesia,150000,3
2025-03-01,Jakarta,Buku,Buku Masak,120000,2
2025-03-04,Bandung,Elektronik,Mouse Wireless,150000,5
2025-03-07,Surabaya,Fashion,Sepatu Sneakers,450000,2
2025-03-10,Jakarta,Fashion,Kaos Polos,95000,7
2025-03-13,Bandung,Buku,Buku Masak,120000,3
2025-03-16,Surabaya,Elektronik,Powerbank 10000mAh,250000,4

Bandingkan file di atas dengan pengalaman chapter Membaca Data CSV di Section Data Processing: di sana kita menulis loop DictReader plus konversi tipe manual. Fungsi pd.read_csv() menangani semuanya — membaca file, menebak tipe setiap kolom, dan mengembalikan DataFrame — dalam satu langkah:

python
import pandas as pd

df = pd.read_csv("penjualan.csv")
print(df.head())
print()
print(df.tail(3))

Output yang Dihasilkan:

text
      tanggal      kota    kategori                produk   harga  jumlah
0  2025-01-03   Jakarta  Elektronik        Mouse Wireless  150000       4
1  2025-01-06   Bandung     Fashion            Kaos Polos   95000       6
2  2025-01-09  Surabaya        Buku  Novel Laskar Pelangi   99000       5
3  2025-01-12   Jakarta  Elektronik      Keyboard Mekanik  750000       1
4  2025-01-15   Bandung  Elektronik    Powerbank 10000mAh  250000       3

       tanggal      kota    kategori              produk   harga  jumlah
21  2025-03-10   Jakarta     Fashion          Kaos Polos   95000       7
22  2025-03-13   Bandung        Buku          Buku Masak  120000       3
23  2025-03-16  Surabaya  Elektronik  Powerbank 10000mAh  250000       4

Metode head() menampilkan lima baris pertama dan tail(3) tiga baris terakhir — kebiasaan pertama setelah membaca file apa pun, untuk memastikan kolom terbaca seperti yang diharapkan.

Inspeksi Cepat dengan info() dan describe() #

Dua metode berikutnya menjawab pertanyaan struktur: ada berapa baris, kolom apa saja, tipe apa, dan berapa nilai kosong:

python
df = pd.read_csv("penjualan.csv")
df.info()
print()
print(df.describe())

Output yang Dihasilkan:

text
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 24 entries, 0 to 23
Data columns (total 6 columns):
 #   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 
 0   tanggal   24 non-null     object
 1   kota      24 non-null     object
 2   kategori  24 non-null     object
 3   produk    24 non-null     object
 4   harga     24 non-null     int64 
 5   jumlah    24 non-null     int64 
dtypes: int64(2), object(4)
memory usage: 1.3+ KB

               harga     jumlah
count      24.000000  24.000000
mean   242208.333333   3.333333
std    189435.082185   1.833663
min     95000.000000   1.000000
25%    120000.000000   2.000000
50%    150000.000000   3.000000
75%    275000.000000   4.000000
max    750000.000000   8.000000

Metode info() mengonfirmasi 24 baris, enam kolom, semua terisi penuh (24 non-null), dengan harga dan jumlah sudah dinferensi sebagai int64 oleh pandas. Metode describe() merangkum kolom numerik: rata-rata harga Rp242.208, harga termurah Rp95.000, termahal Rp750.000, dan jumlah per transaksi rata-rata 3,3 unit. Perbedaan mean-Rp242 ribu dengan median-Rp150 ribu pada kolom harga sudah membisikkan sesuatu: distribusi harga miring ke kanan karena beberapa produk mahal — dugaan yang akan kita buktikan di chapter Analisis Data Eksploratif.

Memilih Kolom, Menghitung, Mengurutkan #

Kolom dipilih dengan kurung siku: satu string menghasilkan Series, list of string menghasilkan DataFrame. Dari sana kita menghitung frekuensi dan keragaman:

python
print(df[["produk", "harga"]].head(3))
print()
print(df["kota"].value_counts())
print()
print("unique :", df["kota"].unique())
print("nunique:", df["kota"].nunique())

Output yang Dihasilkan:

text
                 produk   harga
0        Mouse Wireless  150000
1            Kaos Polos   95000
2  Novel Laskar Pelangi   99000

kota
Jakarta     8
Bandung     8
Surabaya    8
Name: count, dtype: int64

unique : ['Jakarta' 'Bandung' 'Surabaya']
nunique: 3

Metode value_counts() menghitung kemunculan tiap nilai, unique() mendaftar nilai berbeda, dan nunique() menghitung jumlahnya. Untuk menjawab “transaksi termahal mana?”, kita mengurutkan lalu mengintip puncaknya, sambil mencicipi dua pintu pengindeksan berbasis label dan posisi:

python
print(df.sort_values("harga", ascending=False).head(3))
print()
print("loc  :", df.loc[0, "produk"])
print("iloc :", df.iloc[3, 4])

Output yang Dihasilkan:

text
       tanggal      kota    kategori            produk   harga  jumlah
3   2025-01-12   Jakarta  Elektronik  Keyboard Mekanik  750000       1
14  2025-02-16  Surabaya  Elektronik  Keyboard Mekanik  750000       1
9   2025-02-01   Jakarta     Fashion   Sepatu Sneakers  450000       1

loc  : Mouse Wireless
iloc : 750000

Perbedaan loc dan iloc pada contoh di atas: df.loc[0, "produk"] membaca berdasarkan label baris 0 dan nama kolom, sedangkan df.iloc[3, 4] membaca berdasarkan posisi baris ke-3 kolom ke-4 (harga) — keduanya menyentuh mekanisme yang akan dibedah tuntas di chapter DataFrames dan Series.

Alur Kerja pandas #

Lima belas menit pertama dengan dataset baru hampir selalu berpola sama, dan pola itulah kerangka chapter-chapter berikutnya:

  1. Import — pd.read_csv() membawa data mentah ke DataFrame.
  2. Inspeksi — head(), info(), describe() memetakan isi dan tipe.
  3. Bersihkan — tangani nilai kosong, duplikat, dan tipe yang salah (chapter Data Cleaning dengan Pandas).
  4. Transformasi — buat kolom baru seperti total = harga * jumlah (chapter DataFrames dan Series).
  5. Agregasi dan visualisasi — jawab pertanyaan dengan groupby dan grafik (chapter Analisis Data Eksploratif dan dua chapter visualisasi).

Satu langkah dalam pola tersebut belum kita jalankan: dataset latihan ini sengaja dibuat bersih. Data nyata jarang sebaik itu, dan chapter pembersihan akan memperkenalkan versi kotor dari file yang sama.