min-max-dan-count mencari satu nilai ekstrem lewat max() dan idxmax(), tetapi pertanyaan bisnis jarang berhenti di satu pemenang. Dashboard biasanya meminta lima produk terlaris, sepuluh kota dengan pertumbuhan tercepat, atau peringkat seluruh pesaing dalam satu kolom. pandas menyediakan tiga alat untuk kebutuhan itu: rank() yang memberi nomor peringkat untuk setiap baris, nlargest() dan nsmallest() yang memotong tabel menjadi Top-N, dan nunique() yang menghitung kekayaan nilai. Chapter ini membahas ketiganya beserta aturan menangani nilai kembar.

rank() dan Nilai Kembar #

rank() memberi nomor urut berdasarkan posisi nilai di antara sesamanya; secara bawaan peringkat menaik dan rata-rata dipakai untuk nilai kembar. Parameter ascending=False membalik arah sehingga nilai terbesar mendapat peringkat satu — bentuk yang paling sering diminta laporan. Nilai kembar seperti dua produk dengan 85 unit memicu perbedaan metode: bawaan method="average" memberi keduanya 2.5, sedangkan method="min" memberi keduanya peringkat terbaik 2 dan melompati nomor 3. Pilihan lain seperti "first" mengurutkan kembar sesuai urutan baris, berguna saat kriteria seri harus diputuskan oleh urutan data.

python
import pandas as pd

penjualan = pd.DataFrame(
    {
        "produk": ["Kopi Gayo", "Teh Melati", "Gula Aren", "Susu UHT", "Keju Edam"],
        "unit": [120, 85, 85, 200, 60],
        "omzet": [5_400_000, 3_570_000, 4_120_000, 4_800_000, 1_920_000],
    }
)

# rank(): peringkat dari kecil ke besar secara bawaan
print(penjualan["omzet"].rank(ascending=False))

# method="min" memberi peringkat terbaik pada nilai kembar
print("\nrank(method='min', ascending=False) pada kolom unit:")
print(penjualan["unit"].rank(method="min", ascending=False))

# tiga omzet teratas dan dua terbawah
print("\ntiga omzet teratas:")
print(penjualan.nlargest(3, "omzet"))
print("\ndua omzet terbawah:")
print(penjualan.nsmallest(2, "omzet"))

# baris dengan omzet tertinggi lewat idxmax
terbaik = penjualan.loc[penjualan["omzet"].idxmax()]
print("\nproduk terlaris:")
print(terbaik)

Output yang Dihasilkan:

text
0    1.0
1    4.0
2    3.0
3    2.0
4    5.0
Name: omzet, dtype: float64

rank(method='min', ascending=False) pada kolom unit:
0    2.0
1    3.0
2    3.0
3    1.0
4    5.0
Name: unit, dtype: float64

tiga omzet teratas:
      produk  unit    omzet
0  Kopi Gayo   120  5400000
3   Susu UHT   200  4800000
2  Gula Aren    85  4120000

dua omzet terbawah:
       produk  unit    omzet
4   Keju Edam    60  1920000
1  Teh Melati    85  3570000

produk terlaris:
produk    Kopi Gayo
unit            120
omzet       5400000
Name: 0, dtype: object

Mari kita telaah baris-baris kuncinya:

  1. Baris 10: rank(ascending=False) menghasilkan Series peringkat omzet; Susu UHT menempati peringkat 2.0 di bawah Kopi Gayo.
  2. Baris 13-14: rank(method="min", ascending=False) pada kolom unit memberi peringkat 2.0 untuk kedua produk kembar dan tidak melanjutkan ke 3.0.
  3. Baris 17-21: nlargest(3, "omzet") dan nsmallest(2, "omzet") mengembalikan tabel utuh dengan seluruh kolomnya, bukan hanya angka omzetnya.
  4. Baris 24-25: idxmax() dipakai bersama .loc untuk menarik satu baris terbaik, pola yang sudah diajarkan pada chapter min-max-dan-count.

nlargest() dan nsmallest() #

Keduanya adalah pintas langsung untuk Top-N: nlargest(n, "kolom") sama hasilnya dengan sort_values("kolom", ascending=False).head(n), tetapi lebih cepat pada tabel besar karena pandas memakai algoritme seleksi parsial alih-alih mengurutkan seluruh tabel. Parameter keep mengatur perilaku nilai kembar di tepi pemotongan — "first", "last", atau "all" yang membiarkan jumlah baris melebihi n bila seri terjadi di batas. Keduanya juga menerima daftar kolom untuk pemecah seri, misalnya nlargest(3, ["unit", "omzet"]) yang membandingkan unit dahulu lalu omzet.

Peringkat per Kelompok #

rank() bersambung mulus dengan groupby(): df.groupby("kategori")["omzet"].rank(ascending=False) menghasilkan peringkat omzet di dalam masing-masing kategori, alih-alih peringkat global. Pola ini sering dipakai untuk mencari produk terlaris di tiap toko dalam satu panggilan tanpa perulangan manual. Setelah peringkat tersimpan sebagai kolom, filter Top-N per kelompok menjadi satu baris df[df["peringkat"] <= 3] — kombinasi groupby-transform dan boolean mask yang telah kita pakai sejak section Groupby.

Method-method ini berbagi semangat dengan value_counts() pada chapter berikutnya: keduanya mengubah deret angka mentah menjadi informasi posisi. value_counts() menghitung dari sisi frekuensi, dan chapter tersebut membahasnya lengkap beserta parameter normalize dan bins.

Dokumentasi resmi yang relevan: pandas.Series.rank untuk daftar lengkap method, pandas.DataFrame.nlargest untuk parameter columns dan keep, serta pandas.DataFrame.nsmallest sebagai pasangannya.