Data Science
Struktur Data Pandas: Series dan DataFrame
Pelajari struktur data utama Pandas: Series dan DataFrame. Pahami cara membaca file CSV, inspeksi dataset secara cepat, serta seleksi data dengan .loc[] dan .iloc[].

Dalam kegiatan operasional sehari-hari, data bisnis hampir tidak pernah hadir dalam bentuk matriks angka murni yang homogen. Sebuah berkas transaksi e-commerce, misalnya, memuat kombinasi nama pelanggan (string), tanggal transaksi (datetime), jumlah unit yang dibeli (integer), harga barang (float), dan status pengiriman (boolean). Jika Anda memaksakan diri memuat berkas tersebut ke dalam array NumPy, seluruh kolom angka dan tanggal akan otomatis terkonversi menjadi teks string, sehingga kalkulasi finansial menjadi mustahil dilakukan tanpa konversi berbelit-belit. Untuk menangani kompleksitas data tabular heterogen layaknya lembar kerja Excel atau tabel relasional SQL, kita memerlukan pustaka de facto analisis data Python: Pandas.
Yang akan dipelajari
Dalam artikel pengenalan Pandas ini, Anda akan mempelajari konsep dan keterampilan berikut:
- Memahami alasan Pandas menjadi pustaka standar untuk manipulasi data tabular heterogen.
- Membedakan dua struktur data fundamental Pandas: objek 1 dimensi (
Series) dan objek 2 dimensi (DataFrame). - Membuat DataFrame secara terprogram dari struktur dictionary serta memuat berkas data eksternal menggunakan
pd.read_csv(). - Melakukan pemeriksaan kualitas awal dataset secara kilat menggunakan method
.head(),.info(),.describe(), dan atribut.shape. - Mengakses dan mengiris baris serta kolom data secara presisi menggunakan pengindeksan berbasis label (
.loc[]) dan pengindeksan berbasis posisi numerik (.iloc[]).
Series vs DataFrame: Dua Pilar Struktur Data Pandas
Pandas dibangun di atas fondasi NumPy berkecepatan tinggi, tetapi menambahkan lapisan metadata yang sangat kaya berupa label indeks baris dan nama kolom.

1. Pandas Series
Series adalah struktur data satu dimensi yang mampu menyimpan data bertipe apa pun (integer, float, string, objek Python) yang dilengkapi dengan label penunjuk yang disebut Index. Anda dapat menganalogikan Series sebagai satu kolom tunggal dalam spreadsheet Excel.
import pandas as pd
# Membuat Series dari daftar harga produk
harga_produk = pd.Series([25000, 15000, 50000, 12000],
index=["Kopi", "Teh", "Cokelat", "Air Mineral"],
name="Harga_IDR")
print(harga_produk)
print("\nHarga Kopi :", harga_produk["Kopi"])
print("Rata-rata :", harga_produk.mean())
# Output:
# Kopi 25000
# Teh 15000
# Cokelat 50000
# Air Mineral 12000
# Name: Harga_IDR, dtype: int64
#
# Harga Kopi : 25000
# Rata-rata : 25500.0
2. Pandas DataFrame
DataFrame adalah struktur data tabular dua dimensi yang terdiri atas baris (rows) dan kolom (columns). Setiap kolom dalam DataFrame pada hakikatnya adalah sebuah objek Series yang berbagi indeks baris yang sama.
# Membuat DataFrame dari dictionary data transaksi kafe
data_kafe = {
"Menu": ["Kopi Latte", "Teh Tarik", "Cokelat Panas", "Roti Bakar", "Croissant"],
"Kategori": ["Minuman", "Minuman", "Minuman", "Makanan", "Makanan"],
"Harga": [28000, 18000, 25000, 22000, 30000],
"Terjual": [45, 60, 30, 25, 40],
"Tersedia": [True, True, True, False, True]
}
df_kafe = pd.DataFrame(data_kafe)
print(df_kafe)
# Output:
# Menu Kategori Harga Terjual Tersedia
# 0 Kopi Latte Minuman 28000 45 True
# 1 Teh Tarik Minuman 18000 60 True
# 2 Cokelat Panas Minuman 25000 30 True
# 3 Roti Bakar Makanan 22000 25 False
# 4 Croissant Makanan 30000 40 True
Perhatikan bahwa DataFrame di atas secara alami menampung teks, angka bulat, dan boolean secara berdampingan tanpa mengubah tipe data satu sama lain.
Memuat Berkas Data Eksternal (CSV)
Di industri, data umumnya tersimpan dalam berkas berekstensi .csv (Comma Separated Values) atau spreadsheet Excel. Pandas menyediakan fungsi pembaca bawaan yang sangat fleksibel:
import pandas as pd
import io
# Simulasi data CSV dalam bentuk teks (untuk kemudahan praktik langsung)
csv_teks = """id_pelanggan,nama,kota,total_belanja,status_member
CUST001,Ahmad,Jakarta,1500000,Gold
CUST002,Budi,Bandung,450000,Silver
CUST003,Citra,Surabaya,2800000,Platinum
CUST004,Dewi,Jakarta,820000,Gold
CUST005,Eko,Yogyakarta,120000,Regular
"""
# Membaca berkas CSV menggunakan pd.read_csv()
df_pelanggan = pd.read_csv(io.StringIO(csv_teks))
print("Data Pelanggan Berhasil Dimuat:")
print(df_pelanggan)
# Output:
# Data Pelanggan Berhasil Dimuat:
# id_pelanggan nama kota total_belanja status_member
# 0 CUST001 Ahmad Jakarta 1500000 Gold
# 1 CUST002 Budi Bandung 450000 Silver
# 2 CUST003 Citra Surabaya 2800000 Platinum
# 3 CUST004 Dewi Jakarta 820000 Gold
# 4 CUST005 Eko Yogyakarta 120000 Regular
Tips di Google Colab: Jika Anda memiliki berkas
data.csvdi komputer lokal, Anda dapat mengunggahnya ke sesi Colab melalui ikon folder di bilah kiri, lalu membacanya langsung dengandf = pd.read_csv('data.csv').
Inspeksi Awal Dataset: 4 Langkah Diagnostik
Ketika pertama kali menerima dataset baru berukuran ribuan baris, jangan pernah mencetak seluruh baris data ke layar terminal. Selalu terapkan 4 metode diagnostik standar berikut:
1. .head() dan .tail()
Melihat cuplikan 5 baris pertama atau 5 baris terakhir dataset untuk memverifikasi apakah pemisahan kolom berhasil.
# Menampilkan 3 baris teratas
print(df_pelanggan.head(3))
# Menampilkan 2 baris terbawah
print(df_pelanggan.tail(2))
2. .shape
Atribut yang mengembalikan jumlah baris dan kolom dalam bentuk tuple (jumlah_baris, jumlah_kolom).
print("Dimensi dataset (baris, kolom):", df_pelanggan.shape)
# Output: (5, 5)
3. .info()
Memberikan ringkasan teknis menyeluruh: nama-nama kolom, jumlah nilai non-null (tidak kosong), tipe data per kolom, dan estimasi konsumsi memori RAM.
df_pelanggan.info()
# Output di konsol:
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 5 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 id_pelanggan 5 non-null object
# 1 nama 5 non-null object
# 2 kota 5 non-null object
# 3 total_belanja 5 non-null int64
# 4 status_member 5 non-null object
# dtypes: int64(1), object(4)
# memory usage: 328.0 bytes
Catatan: Tipe data object di Pandas biasanya merepresentasikan teks string.
4. .describe()
Menghasilkan ringkasan statistik deskriptif cepat (rata-rata, standar deviasi, nilai minimum, kuartil 25%, 50%, 75%, dan maksimum) untuk seluruh kolom bertipe numerik.
print(df_pelanggan.describe())
# Output:
# total_belanja
# count 5.000000
# mean 1138000.000000
# std 1057435.577234
# min 120000.000000
# 25% 450000.000000
# 50% 820000.000000
# 75% 1500000.000000
# max 2800000.000000
Memilih Data: Kolom, .loc[], dan .iloc[]
Mengakses bagian tertentu dari DataFrame adalah operasi paling fundamental dalam data wrangling.
1. Mengambil Kolom Tertentu
- Satu kolom (menghasilkan Series):
df["nama_kolom"] - Banyak kolom (menghasilkan DataFrame baru):
df[["kolom_1", "kolom_2"]]
# Mengambil kolom nama (Series)
nama_series = df_pelanggan["nama"]
# Mengambil subset nama dan total belanja (DataFrame)
subset_df = df_pelanggan[["nama", "total_belanja"]]
print(subset_df)
# Output:
# nama total_belanja
# 0 Ahmad 1500000
# 1 Budi 450000
# 2 Citra 2800000
# 3 Dewi 820000
# 4 Eko 120000
2. Seleksi Baris & Kolom: .loc[] vs .iloc[]
Inilah pembeda krusial yang sering membingungkan pemula:
.loc[](label-based): Memilih baris dan kolom berdasarkan nama label / teks indeksnya. Batas akhir pada slicing.locbersifat inklusif (diikutsertakan)..iloc[](integer-position-based): Memilih baris dan kolom berdasarkan urutan posisi numerik indeks (0, 1, 2, ...). Batas akhir pada slicing.ilocbersifat eksklusif (seperti slicing Python standar).
Format umum keduanya adalah: df.loc[baris, kolom] atau df.iloc[baris, kolom].
# Set kolom 'id_pelanggan' sebagai index DataFrame agar perbedaannya nyata
df_indexed = df_pelanggan.set_index("id_pelanggan")
print(df_indexed)
# --- Menggunakan .loc (Label Nama) ---
# Mengambil data baris 'CUST002' untuk kolom 'kota' dan 'total_belanja'
hasil_loc = df_indexed.loc["CUST002", ["kota", "total_belanja"]]
print("\nHasil .loc CUST002:")
print(hasil_loc)
# Slicing baris dengan .loc: batas akhir 'CUST003' IKUT terambil!
print("\nSlicing .loc dari CUST001 sampai CUST003:")
print(df_indexed.loc["CUST001":"CUST003", ["nama", "status_member"]])
# --- Menggunakan .iloc (Posisi Angka) ---
# Mengambil baris posisi pertama (indeks 0) dan kolom posisi ke-0 serta ke-2
hasil_iloc = df_indexed.iloc[0, [0, 2]]
print("\nHasil .iloc posisi [0, [0, 2]]:")
print(hasil_iloc)
# Slicing baris dengan .iloc: posisi 0 sampai 2 (hanya baris 0 dan 1, baris 2 TIDAK ikut)
print("\nSlicing .iloc posisi 0:2:")
print(df_indexed.iloc[0:2, 0:2])
# Output:
# nama kota total_belanja status_member
# id_pelanggan
# CUST001 Ahmad Jakarta 1500000 Gold
# CUST002 Budi Bandung 450000 Silver
# CUST003 Citra Surabaya 2800000 Platinum
# CUST004 Dewi Jakarta 820000 Gold
# CUST005 Eko Yogyakarta 120000 Regular
#
# Hasil .loc CUST002:
# kota Bandung
# total_belanja 450000
# Name: CUST002, dtype: object
#
# Slicing .loc dari CUST001 sampai CUST003:
# nama status_member
# id_pelanggan
# CUST001 Ahmad Gold
# CUST002 Budi Silver
# CUST003 Citra Platinum
#
# Hasil .iloc posisi [0, [0, 2]]:
# nama Ahmad
# total_belanja 1500000
# Name: CUST001, dtype: object
#
# Slicing .iloc posisi 0:2:
# nama kota
# id_pelanggan
# CUST001 Ahmad Jakarta
# CUST002 Budi Bandung
Coba sendiri
Praktikkan eksperimen eksplorasi data berikut di Google Colab:
- Buat DataFrame inventaris toko buku dengan 5 judul buku, harga, jumlah stok, dan rating pembaca (1.0 - 5.0).
- Tampilkan informasi struktur tipe data dengan
.info()dan ringkasan angka statistik dengan.describe(). - Tambahkan kolom baru bernama
"Nilai_Aset"yang merupakan hasil perkalian kolom"Harga"dengan"Stok". - Ambil 3 baris teratas untuk kolom
"Judul"dan"Nilai_Aset"menggunakan pengindeksan.iloc[].
# Coba jalankan di sel Google Colab:
import pandas as pd
buku = pd.DataFrame({
"Judul": ["Belajar Python", "Machine Learning Praktis", "Statistika Terapan", "Algoritma Pemrograman", "Sains Data"],
"Harga": [95000, 140000, 85000, 110000, 125000],
"Stok": [15, 8, 20, 12, 10],
"Rating": [4.8, 4.9, 4.5, 4.6, 4.7]
})
# Menambahkan kolom kalkulasi baru (vektorisasi Pandas)
buku["Nilai_Aset"] = buku["Harga"] * buku["Stok"]
print("DataFrame Buku Lengkap:")
print(buku)
print("\nSeleksi 3 baris teratas (kolom Judul dan Nilai_Aset):")
print(buku.iloc[0:3, [0, 4]])
Kesalahan yang sering terjadi
Berikut adalah jebakan umum saat bekerja dengan DataFrame Pandas beserta cara mengatasinya:
| Kesalahan Pemula | Gejala / Pesan Kesalahan | Penyebab Utama | Solusi yang Tepat |
|---|---|---|---|
| Lupa kurung ganda saat memilih banyak kolom | KeyError: ('kolom_a', 'kolom_b') |
Menulis df['a', 'b'] alih-alih memberikan list kolom. |
Berikan list di dalam kurung siku: df[['kolom_a', 'kolom_b']]. |
Tertukar antara .loc dan .iloc |
TypeError: cannot do label indexing on Index with integer keys... |
Menggunakan label teks di .iloc atau mengira batas akhir .loc bersifat eksklusif. |
Ingat: .loc untuk Label teks (inklusif), .iloc untuk Integer posisi (eksklusif). |
| Melakukan filter tanpa menyimpan ke variabel | Perubahan pada DataFrame hilang begitu saja | Mengira method Pandas memodifikasi objek secara inplace secara default. | Simpan hasil ke variabel: df = df.method() atau gunakan parameter inplace=True jika didukung. |
Peringatan SettingWithCopyWarning |
Peringatan kuning panjang saat mengubah nilai kolom | Mengubah nilai pada hasil slice tanpa membuat salinan eksplisit. | Gunakan .loc secara eksplisit atau tambahkan .copy() saat membuat sub-dataframe: sub_df = df[kondisi].copy(). |
Kaitannya dengan Praktik Industri / AI: Dalam proyek rekayasa data nyata, lebih dari 70% waktu seorang data scientist dialokasikan pada tahapan kurasi data tabular menggunakan Pandas sebelum data tersebut dapat diumpankan ke model machine learning Scikit-Learn. Scikit-Learn mengharapkan matriks fitur berupa DataFrame berisi kolom-kolom prediktor dan vektor target berupa Series satu kolom. Menguasai
.locdan.ilocmemastikan proses pemisahan variabel penjelas dan variabel target berjalan tepat tanpa risiko salah potong data.
Latihan
Asah keterampilan eksplorasi data Anda dengan 3 latihan berikut:
- Soal 1: Buatlah sebuah Series Pandas bernama
omset_mingguanyang berisi angka omset selama 7 hari (Senin sampai Minggu):[3500000, 4200000, 3900000, 4100000, 5600000, 7800000, 6900000]. Tentukan nama hari sebagai indeks barisnya, lalu hitung omset tertinggi beserta nama hari terjadinya omset tersebut. - Soal 2: Diberikan DataFrame kinerja karyawan berikut:
Gunakandf_karyawan = pd.DataFrame({ "NIK": ["EMP01", "EMP02", "EMP03", "EMP04"], "Nama": ["Rian", "Sari", "Deni", "Maya"], "Departemen": ["IT", "Pemasaran", "IT", "Keuangan"], "Gaji": [12000000, 9500000, 11000000, 10500000] }).iloc[]untuk mengambil baris ke-2 dan ke-3 (Sari dan Deni) hanya untuk kolomNamadanGaji. - Soal 3: Dari
df_karyawanpada Soal 2, ubah kolomNIKmenjadi indeks utama DataFrame (set_index). Kemudian gunakan.loc[]untuk mengambil informasi karyawan dengan NIK"EMP03"(tampilkan seluruh kolomnya).
Kunci jawaban dan pembahasan
Solusi Soal 1
import pandas as pd
hari = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
omset = [3500000, 4200000, 3900000, 4100000, 5600000, 7800000, 6900000]
omset_mingguan = pd.Series(omset, index=hari, name="Omset_Harian")
# Mencari nilai tertinggi dan label hari terjadinya
omset_maksimal = omset_mingguan.max()
hari_tertinggi = omset_mingguan.idxmax()
print(omset_mingguan)
print(f"\nOmset tertinggi adalah Rp {omset_maksimal:,} yang tercatat pada hari {hari_tertinggi}.")
# Output:
# Senin 3500000
# Selasa 4200000
# Rabu 3900000
# Kamis 4100000
# Jumat 5600000
# Sabtu 7800000
# Minggu 6900000
# Name: Omset_Harian, dtype: int64
#
# Omset tertinggi adalah Rp 7,800,000 yang tercatat pada hari Sabtu.
Pembahasan: Method .max() mengembalikan nilai numerik tertinggi dalam Series, sedangkan .idxmax() mengembalikan label indeks (nama hari) tempat nilai tertinggi itu berada.
Solusi Soal 2
import pandas as pd
df_karyawan = pd.DataFrame({
"NIK": ["EMP01", "EMP02", "EMP03", "EMP04"],
"Nama": ["Rian", "Sari", "Deni", "Maya"],
"Departemen": ["IT", "Pemasaran", "IT", "Keuangan"],
"Gaji": [12000000, 9500000, 11000000, 10500000]
})
# Sari berada di baris indeks 1, Deni di baris indeks 2 -> slice 1:3
# Kolom Nama di indeks 1, Gaji di indeks 3 -> list [1, 3]
hasil_seleksi = df_karyawan.iloc[1:3, [1, 3]]
print(hasil_seleksi)
# Output:
# Nama Gaji
# 1 Sari 9500000
# 2 Deni 11000000
Pembahasan: .iloc menggunakan posisi numerik murni. Slicing baris 1:3 mencakup baris 1 dan 2 (posisi 3 eksklusif). Pemilihan kolom [1, 3] mengambil tepat kolom Nama (kolom ke-2) dan Gaji (kolom ke-4).
Solusi Soal 3
import pandas as pd
df_karyawan = pd.DataFrame({
"NIK": ["EMP01", "EMP02", "EMP03", "EMP04"],
"Nama": ["Rian", "Sari", "Deni", "Maya"],
"Departemen": ["IT", "Pemasaran", "IT", "Keuangan"],
"Gaji": [12000000, 9500000, 11000000, 10500000]
})
# Mengubah kolom NIK menjadi index DataFrame
df_nik = df_karyawan.set_index("NIK")
# Mengakses data EMP03 dengan .loc
data_deni = df_nik.loc["EMP03"]
print("Data Karyawan EMP03:")
print(data_deni)
# Output:
# Data Karyawan EMP03:
# Nama Deni
# Departemen IT
# Gaji 11000000
# Name: EMP03, dtype: object
Pembahasan: Fungsi .set_index("NIK") mempromosikan kolom NIK menjadi pengenal baris unik. Dengan .loc["EMP03"], Pandas mengembalikan satu baris data tersebut dalam bentuk Series yang beranggotakan nama kolom-kolom sisanya.



Diskusi (0)
Kami menyimpan nama (opsional), komentar, dan hash teknis (bukan alamat IP asli) untuk mencegah spam. Cookie fungsional dipakai agar Anda dapat mengedit atau menghapus komentar sendiri dari browser ini. Untuk permintaan penghapusan, gunakan halaman kontak.
Belum ada komentar. Mulai diskusinya.