TL;DR
Pandas drop_duplicates() ngehapus baris kembar di DataFrame dan nyimpen satu salinannya. Secara default dia ngecek semua kolom dan nyimpen kemunculan pertama. Pakai subset biar cuma ngecek kolom kunci kayak id_transaksi, dan keep buat milih nyimpen yang pertama, terakhir, atau buang semua yang kembar. Setelah dibuang, indeksnya jadi bolong, jadi biasanya perlu reset_index. Selalu cek jumlah baris sebelum dan sesudah biar tau berapa yang kebuang.
Pandas drop_duplicates() ngehapus baris kembar di DataFrame dan nyimpen satu salinannya.
Masalah paling sering: versi polosnya ngecek semua kolom. Dua baris yang sebenernya duplikat sering lolos cuma gara-gara satu kolom, misalnya timestamp, beda beberapa detik.
Di tutorial ini kamu bakal belajar pakai subset buat kolom kunci, milih baris mana yang disimpan, dan rapiin indeks setelah menghapus.
drop_duplicates() adalah method DataFrame yang ngebuang baris yang isinya sama. Secara default dia ngebandingin seluruh kolom, dan kalau ada dua baris yang identik di semua kolom, dia nyimpen yang pertama dan buang sisanya. Hasilnya DataFrame baru tanpa baris kembar.
Ini penting buat data yang digabung dari beberapa sumber, di mana transaksi yang sama bisa keinput dua kali. Duplikat bikin total dan hitungan jadi ketinggian.
Mulai dari cek dulu ada berapa baris duplikat sebelum dibuang, pakai duplicated().
import pandas as pd
df = pd.read_csv('toko_berkah.csv')
# Hitung berapa baris duplikat
print(df.duplicated().sum())
# Buang duplikat, simpan yang pertama
df_bersih = df.drop_duplicates()
print(len(df), '->', len(df_bersih))
Baris terakhir itu pengaman. Bandingin jumlah baris sebelum dan sesudah biar kamu tau persis berapa yang kebuang. Konsep menjaga baris tetap unik ini mirip ide primary key di database.
Ini yang paling sering kamu butuhin. Pakai subset biar drop_duplicates cuma ngecek kolom kunci, bukan semua kolom.
# Anggap duplikat kalau id_transaksi sama
df_bersih = df.drop_duplicates(subset=['id_transaksi'])
# Bisa beberapa kolom sebagai kunci gabungan
df_bersih = df.drop_duplicates(subset=['tanggal', 'produk', 'kasir'])
Sekarang dua baris dengan id_transaksi sama dianggap kembar walau kolom timestamp-nya beda. Ini jauh lebih akurat dari drop_duplicates polos buat data transaksi yang punya ID unik.
keep nentuin baris mana yang disimpan waktu ada duplikat. Ada tiga pilihan.
| Nilai keep | Efek |
|---|---|
keep='first' | Simpan kemunculan pertama (default) |
keep='last' | Simpan kemunculan terakhir |
keep=False | Buang semua baris yang punya kembaran |
# Simpan versi terakhir, misalnya data terbaru
df_bersih = df.drop_duplicates(subset=['id_transaksi'], keep='last')
# Buang semua baris yang punya duplikat, sisakan yang benar-benar unik
df_unik = df.drop_duplicates(subset=['id_transaksi'], keep=False)
keep='last' berguna kalau baris terbaru itu yang paling update. keep=False berguna buat nyari baris mana aja yang bermasalah, soalnya dia nyisain cuma yang gak punya kembaran.
Setelah baris dibuang, indeksnya jadi bolong. Kalau baris 3 dan 7 kehapus, indeksnya lompat-lompat. Rapiin pakai reset_index.
df_bersih = df.drop_duplicates(subset=['id_transaksi']).reset_index(drop=True)
drop=True penting. Tanpa itu, indeks lama malah disimpan jadi kolom baru. Indeks yang rapi bikin operasi selanjutnya kayak loc dan penggabungan lebih gampang.
Dataset toko_berkah punya Ngulik Data isinya transaksi dari dua kasir yang digabung jadi satu file. Total 8.400 baris.
Gara-gara proses gabung manual, sebagian transaksi keinput dua kali dengan timestamp beda tipis. Kalau aku pakai drop_duplicates polos:
df.drop_duplicates() # sisa 8.400, gak ada yang kebuang
df.drop_duplicates(subset=['id_transaksi']) # sisa 8.164 baris
Versi polos gak nemu satu duplikat pun, soalnya timestamp yang beda bikin tiap baris keliatan unik. Versi subset=['id_transaksi'] nemu 236 duplikat dan buang semuanya.
Efeknya ke total qty terjual lumayan: turun 2,8% setelah dibersihin. Kalau pemiliknya ngambil keputusan stok dari angka kotor, dia over-order 2,8% di tiap produk. Kuncinya cuma satu: pilih kolom kunci yang bener di subset.
Pakai versi polos di data yang punya kolom timestamp. Timestamp yang beda tipis bikin baris kembar keliatan unik. Selalu pikirin subset dengan kolom kunci.
Lupa hasilnya DataFrame baru. df.drop_duplicates() gak ngubah df asli. Simpan ke variabel: df = df.drop_duplicates(...). Kalau lupa, kamu kira udah bersih padahal belum.
Gak reset_index. Indeks bolong bikin operasi selanjutnya berantakan. Tambahin .reset_index(drop=True).
Salah pilih keep. Kalau baris terbaru yang penting, tapi kamu pakai keep default first, kamu malah nyimpen yang lama. Sesuaikan keep sama urutan datamu.
Gak bedain duplikat asli sama data yang emang berulang. Dua transaksi beda dengan produk sama bukan duplikat. Pastikan kolom kunci di subset beneran nunjukin baris yang sama, bukan cuma mirip.
duplicated() ngasih Series berisi True atau False buat tiap baris, nandain mana yang duplikat, tanpa menghapus apa pun. drop_duplicates() beneran ngebuang baris duplikatnya. Pakai duplicated() dulu buat ngintip dan ngitung berapa duplikat, atau buat lihat baris mana yang kena. Setelah yakin, baru pakai drop_duplicates() buat ngehapus. Keduanya nerima argumen subset dan keep yang sama.
Nggak secara default. Method ini ngembaliin DataFrame baru dan ninggalin yang asli utuh. Buat nyimpen hasilnya, assign ke variabel, misalnya df = df.drop_duplicates(). Versi lama pandas punya inplace=True, tapi cara yang lebih disaranin sekarang adalah assign ulang. Ini bikin kode lebih jelas dan aman dari perubahan yang gak sengaja.
Urutkan dulu DataFrame berdasarkan kolom waktu, lalu pakai keep dengan nilai yang sesuai. Kalau data diurut dari lama ke baru, pakai keep='last' biar yang terbaru disimpan. Atau urut dari baru ke lama, lalu pakai keep='first'. Yang penting kamu ngatur urutan datanya dulu, soalnya drop_duplicates nyimpen baris berdasarkan posisi, bukan berdasarkan nilai waktu secara otomatis.
drop_duplicates ngebuang baris yang isinya kembar dengan baris lain. dropna ngebuang baris yang punya nilai kosong atau NaN. Dua-duanya buat bersih-bersih data, tapi masalah yang diselesaikan beda. Kalau data kamu punya baris ganda sekaligus banyak sel kosong, biasanya kamu pakai keduanya berurutan. Lihat cara pakai dropna di panduan terpisah buat menangani data kosong.
Biasanya karena ada kolom yang nilainya beda tipis, kayak timestamp, ID internal, atau spasi tersembunyi di teks. drop_duplicates polos ngecek semua kolom, jadi satu perbedaan kecil bikin baris dianggap unik. Solusinya pakai subset dengan cuma kolom kunci yang beneran nentuin keunikan. Buat teks, bersihin dulu spasi pakai str.strip() biar Bandung dan Bandung dengan spasi gak dianggap beda.
drop_duplicates gampang, tapi versi polosnya sering meleset di data yang punya kolom timestamp atau ID internal. Satu perbedaan kecil bikin duplikat lolos.
Aturan amannya: cek dulu pakai duplicated(), pakai subset dengan kolom kunci, pilih keep sesuai urutan data, dan reset_index setelahnya.
Semua argumen drop_duplicates ada di dokumentasi resmi pandas.
Kalau data kamu juga punya sel kosong, lanjut ke pandas dropna. Dan buat ngelompokin data bersih jadi ringkasan, cek pandas groupby. Bersih-bersih semacam ini bagian dari data wrangling.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.