Pada Chapter sebelumnya kita mengurutkan DataFrame dengan sort_values() berdasarkan satu kolom. Dalam pekerjaan nyata, satu kunci pengurutan sering kali tidak cukup: laporan inventaris biasanya diminta menampilkan stok dari yang paling sedikit, lalu harga dari yang paling mahal untuk stok yang sama. Kebutuhan seperti ini diselesaikan dengan memberikan beberapa kolom sekaligus kepada sort_values(). Chapter ini membahas cara menyusun beberapa kunci pengurutan dan mengatur arah ascending untuk masing-masing kolom.
Cara Kerja Pengurutan Banyak Kunci #
Ketika parameter by berisi list nama kolom, sort_values() menerapkan pengurutan bertingkat. Seluruh baris pertama-tama diurutkan berdasarkan kolom pertama; kemudian hanya baris yang nilai kolom pertamanya sama yang diurutkan kembali berdasarkan kolom kedua, dan seterusnya untuk kolom berikutnya. Dengan mekanisme ini, kunci kedua hanya berperan sebagai penentu urutan di antara baris yang seri pada kunci pertama.
Parameter ascending mengikuti pola yang sama. ascending menerima nilai True atau False tunggal yang berlaku untuk semua kolom, atau list sepanjang by yang mengatur arah setiap kolom secara terpisah. Parameter na_position tetap berlaku: nilai NaN ditempatkan di bagian akhir secara default, atau di bagian awal bila kita mengisi na_position=“first”.
Contoh: Mengurutkan Inventori dengan Dua Kunci #
Kita gunakan data inventori toko dengan lima produk. Index berisi kode produk P-101 sampai P-105 yang sengaja ditulis acak. Sasarannya jelas: tampilkan produk dengan stok paling sedikit lebih dulu, dan untuk stok yang sama, tampilkan harga paling mahal lebih dulu.
import pandas as pd
inventori = pd.DataFrame(
{
"produk": ["Kopi Gayo", "Teh Melati", "Gula Aren", "Sirup Jahe", "Madu Sumatera"],
"stok": [42, 15, 42, 8, 27],
"harga": [85000, 32000, 88000, 21000, 95000],
},
index=["P-103", "P-101", "P-102", "P-105", "P-104"],
)
print(inventori)
print()
urut_naik = inventori.sort_values(["stok", "harga"], ascending=[True, True])
print(urut_naik)
print()
urut_campur = inventori.sort_values(["stok", "harga"], ascending=[True, False])
print(urut_campur)Output yang Dihasilkan:
produk stok harga
P-103 Kopi Gayo 42 85000
P-101 Teh Melati 15 32000
P-102 Gula Aren 42 88000
P-105 Sirup Jahe 8 21000
P-104 Madu Sumatera 27 95000
produk stok harga
P-105 Sirup Jahe 8 21000
P-101 Teh Melati 15 32000
P-104 Madu Sumatera 27 95000
P-103 Kopi Gayo 42 85000
P-102 Gula Aren 42 88000
produk stok harga
P-105 Sirup Jahe 8 21000
P-101 Teh Melati 15 32000
P-104 Madu Sumatera 27 95000
P-102 Gula Aren 42 88000
P-103 Kopi Gayo 42 85000Mari kita telaah kode di atas:
- Baris 3-10: kita membangun DataFrame inventori dengan kolom produk, stok, dan harga, serta index berisi kode produk yang tidak berurutan.
- Baris 12-13: print(inventori) menampilkan tabel awal sebagai pembanding.
- Baris 14-15: sort_values([“stok”, “harga”], ascending=[True, True]) mengurutkan stok menaik; dua baris ber-stok 42, yaitu Kopi Gayo (harga 85000) dan Gula Aren (harga 88000), diurutkan berdasarkan harga menaik sehingga Kopi Gayo muncul lebih dulu.
- Baris 17-18: ascending=[True, False] membuat harga diurutkan menurun; kini Gula Aren (88000) mendahului Kopi Gayo (85000). Bandingkan posisi kedua baris ber-stok 42 pada tabel kedua dan ketiga.
- Konsekuensi: sort_values() selalu mengembalikan DataFrame baru; variabel inventori tidak pernah berubah.
Mengatur Arah ascending per Kolom #
Tabel berikut merangkum kombinasi yang sering dipakai:
| by | ascending | Hasil |
|---|---|---|
| [“stok”, “harga”] | True (default) | stok menaik, harga menaik |
| [“stok”, “harga”] | [True, False] | stok menaik, harga menurun |
| [“stok”, “harga”] | False | semua kolom menurun |
Satu aturan penting: panjang list ascending harus sama dengan panjang list by. Bila jumlah keduanya berbeda, pandas langsung melempar ValueError dengan pesan yang menyebut panjang ascending dan by. Sebaliknya, nilai True atau False tunggal tetap sah dan berlaku untuk semua kolom sekaligus.
Kombinasi banyak kunci muncul di hampir semua laporan: peringkat penjualan per wilayah lalu per total transaksi, daftar hadir per kelas lalu per nama, atau antrian produksi per tanggal lalu per tingkat prioritas. Setiap kali pertanyaan Anda memuat kata “lalu” setelah kriteria pengurutan pertama, itu tanda ascending dan by berupa list diperlukan. Ringkasan resmi 10 minutes to pandas memuat pengurutan di antara topik dasarnya, cocok sebagai bacaan pembanding.
Dengan sort_values() multi kolom, isi tabel dapat kita susun sesuai kebutuhan laporan. Namun perhatikan label index pada tabel hasil: label ikut berpindah mengikuti barisnya sehingga urutannya menjadi acak. Chapter berikutnya membahas sort_index(), method untuk mengurutkan baris berdasarkan label index itu sendiri.