Seleksi satu dimensi jarang cukup untuk pekerjaan nyata: laporan biasanya meminta baris E002 sampai E004 yang hanya menampilkan kolom nama dan kota. Menjalankan dua seleksi terpisah memungkinkan, tetapi pandas menyediakan cara yang lebih ringkas. Property .loc dan .iloc menerima dua bagian yang dipisahkan koma: bagian kiri koma untuk baris, bagian kanan koma untuk kolom. Chapter ini mempraktikkan potongan dua dimensi tersebut dengan kedua basis seleksi dan membedah sifat hasilnya.
Potongan Dua Dimensi dengan loc #
Untuk memotong baris dan kolom sekaligus dengan .loc, tulis bagian baris di kiri koma dan bagian kolom di kanan koma. Setiap sisi boleh memakai bentuk apa pun yang sah untuk basis label: satu label, list label, atau rentang label. Contoh berikut mengambil rentang E002 sampai E004 dengan dua kolom tertentu, sebagaimana dibahas pada panduan Indexing and selecting data
.
import pandas as pd
karyawan = pd.DataFrame(
{
"nama": ["Budi", "Siti", "Dewi", "Andi", "Rina"],
"kota": ["Bandung", "Jakarta", "Surabaya", "Bandung", "Medan"],
"umur": [29, 34, 25, 31, 27],
"gaji": [8500000, 10500000, 7200000, 9800000, 8000000],
},
index=["E001", "E002", "E003", "E004", "E005"],
)
potongan_loc = karyawan.loc["E002":"E004", ["nama", "kota"]]
print(potongan_loc)
print()
potongan_iloc = karyawan.iloc[1:3, 0:2]
print(potongan_iloc)
print()
potongan_loc.loc["E002", "kota"] = "Bekasi"
print(karyawan.loc["E002", "kota"])Output yang Dihasilkan:
nama kota
E002 Siti Jakarta
E003 Dewi Surabaya
E004 Andi Bandung
nama kota
E002 Siti Jakarta
E003 Dewi Surabaya
JakartaMari kita telaah peran setiap bagian kode di atas:
- Baris 3-11 (
karyawan = pd.DataFrame(...)): dataset lima karyawan yang sama dengan label indexE001sampaiE005. - Baris 13 (
potongan_loc = karyawan.loc["E002":"E004", ["nama", "kota"]]): bagian kiri koma adalah rentang label untuk baris, bagian kanan koma adalah list nama kolom. - Baris 17 (
potongan_iloc = karyawan.iloc[1:3, 0:2]): versi.ilocmemakai rentang posisi untuk kedua dimensi, yaitu posisi baris 1-2 dan posisi kolom 0-1. - Baris 21-22: kita mengubah satu nilai pada hasil potongan, lalu membaca nilai yang sama langsung dari
karyawan.
Kombinasi Isi Bagian Baris dan Kolom #
Kedua potongan pada output menghasilkan isi yang sama, tetapi basis pemilihannya berbeda: .loc membaca label, sedangkan .iloc membaca posisi. Bentuk-bentuk lain juga sah: karyawan.loc["E002", "kota"] mengambil satu sel, sementara karyawan.loc[:, "nama":"kota"] mengambil semua baris dengan rentang kolom nama sampai kota; titik dua tanpa batas berarti seluruh baris. Pada .iloc, kedua sisi koma harus berupa posisi integer atau rentang posisi, misalnya karyawan.iloc[1:3, 0:2] pada contoh kita. Aturan slicing yang berbeda tetap berlaku: rentang .loc inklusif pada batas akhir, rentang .iloc eksklusif.
Hasil Potongan Berperilaku seperti Copy #
Dua baris terakhir kode memeriksa sifat hasil potongan. Baris 21 mengganti kota pada potongan_loc untuk label E002 menjadi Bekasi, lalu baris 22 membaca nilai yang sama langsung dari karyawan. Output mencetak Jakarta, artinya data asli tidak berubah. Inilah Copy-on-Write
pada pandas 3.0: hasil .loc maupun .iloc, termasuk potongan dua dimensi, berperilaku seperti copy, sehingga mengubah hasilnya tidak pernah menyentuh DataFrame sumber. Bila tujuan kita memang mengubah data asli, tulis penugasan pada DataFrame sumber dengan satu akses .loc, misalnya karyawan.loc["E002", "kota"] = "Bekasi".
Semua pola seleksi yang kita bahas sejauh ini mengandalkan alamat yang sudah diketahui: nama kolom, label index, atau posisi. Kebutuhan analisis yang lebih umum adalah memilih baris yang memenuhi suatu syarat, misalnya semua karyawan berumur di atas 27 tahun. Chapter berikutnya membahas filtering dengan kondisi boolean, pola seleksi yang paling sering kita pakai sehari-hari.