Pandas'ta Mükerrer Kayıtları Bulma ve Silme: duplicated ve drop_duplicates
Beceri rehberi

Pandas'ta Mükerrer Kayıtları Bulma ve Silme: duplicated ve drop_duplicates

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Pandas'ta tekrar eden satırları önce duplicated ile bulup inceler, sonra drop_duplicates ile subset ve keep parametrelerini kullanarak güvenle silersiniz. Örneklerle adım adım öğrenirsiniz.

Bir bakışta

  1. Önce bulun, sonra silin. duplicated tekrarları işaretler, drop_duplicates kaldırır; arada örnekleri incelemek hatayı önler.
  2. keep hangi kaydın kalacağını belirler. first ilkini, last sonuncuyu tutar; False tekrar eden her satırı siler.
  3. subset yalnız belirli sütunlara bakar. E-posta gibi anahtar sütunlara göre kısmi tekrarlar bulunur.
  4. Doğru kaydı seçmek için önce sıralayın. keep="last" tablodaki sıraya bakar; en güncel kaydı tutmak için tarihe göre sıralayın.
  5. Yazım farkları gizli tekrar üretir. Boşluk ve harf büyüklüğünü normalleştirmeden yapılan temizlik eksik kalır.

Tekrar eden satırlar nereden gelir, neden sorundur

Aynı kaydın veri setinde birden çok kez bulunması veri çalışmalarında sık karşılaşılan bir temizlik kalemidir. Kaynağı çeşitlidir: aynı dosyanın iki kez yüklenmesi, birden çok kaynaktan birleştirme, formun çift gönderilmesi, bir sistem hatası ya da aynı müşterinin farklı kanallardan kaydolması. Sonuç aynıdır: sayımlar şişer, toplamlar yanlış çıkar, ortalamalar ve model eğitimi sapar.

Önce neyin tekrar sayılacağına karar vermek gerekir. Tüm sütunları birebir aynı olan satır tam tekrardır. Yalnız kimlik gibi anahtar sütunların aynı olduğu, diğer değerlerin farklı olduğu satır ise kısmi tekrardır: aynı müşteri için farklı tarihli iki kayıt gibi. İkisi aynı yöntemle ele alınmaz. Tam tekrar çoğunlukla güvenle silinir; kısmi tekrarda hangi kaydın doğru olduğuna iş kuralıyla karar verilir.

Pandas bu iş için iki yöntem sunar: DataFrame.duplicated hangi satırların tekrar olduğunu işaretler, DataFrame.drop_duplicates ise bunları siler. Önce bulup incelemek, sonra silmek, geri dönülmesi zor bir işlemi bilinçli yapmanın yoludur. Excel'de ve SQL'de aynı işin karşılıkları ayrı rehberlerde yer alır; burada yalnız pandas ele alınır.

Şekil 1

Önce bul, incele, karar ver, sil, doğrula

Güvenli tekrar temizliği

  1. Tekrar tanımını belirleyinTüm sütunlar mı, yalnız anahtar sütunlar mı?
  2. duplicated ile işaretleyinHangi satırların tekrar olduğunu görün.
  3. Örnekleri inceleyinTekrarların gerçekten aynı kayıt olduğunu doğrulayın.
  4. drop_duplicates ile silinHangisinin kalacağını keep ile seçin.
  5. Sonucu doğrulayınSatır sayısı ve toplamlar beklenen gibi mi?
Kaynak: pandas belgeleriMindset Institute

duplicated ile tekrarları bulmak

DataFrame.duplicated, her satır için True ya da False içeren bir boolean Series döndürür. Varsayılan davranışta ilk görülen satır False, sonraki aynı satırlar True olarak işaretlenir:

import pandas as pd

musteri = pd.DataFrame({ "eposta": ["[email protected]", "[email protected]", "[email protected]", "[email protected]"], "sehir": ["Ankara", "İzmir", "Ankara", "Bursa"], })

tekrar = musteri.duplicated() print(tekrar.sum())

Burada tekrar.sum() tekrar sayısını verir, çünkü True değerler toplanırken bir sayılır. Tekrar eden satırları görmek için boolean Series'i filtre olarak kullanabilirsiniz: musteri[tekrar].

keep parametresi hangi satırların işaretleneceğini belirler. Pandas belgelerine göre keep="first" (varsayılan) ilk görüleni işaretsiz bırakır, keep="last" sonuncuyu işaretsiz bırakır, keep=False ise tekrar eden her satırı, ilk görülen dahil, True olarak işaretler. Tekrar edenlerin tümünü görüp incelemek istiyorsanız keep=False en kullanışlısıdır:

musteri[musteri.duplicated(keep=False)]

subset parametresi hangi sütunlara bakılacağını belirler. Varsayılan olarak tüm sütunlar karşılaştırılır; yalnız e-posta tekrarı arıyorsanız musteri.duplicated(subset=["eposta"]) yazarsınız. subset'teki sütunların karşılaştırılabilir (hashable) olması gerekir; liste gibi değiştirilebilir değerler içeren sütunlar hata verir.

drop_duplicates ile silmek

DataFrame.drop_duplicates, tekrar eden satırları kaldırılmış yeni bir DataFrame döndürür. Parametreleri duplicated ile aynı mantıktadır:

temiz = musteri.drop_duplicates()

Belgelere göre varsayılan davranış, ilk görülen satırı tutmak ve sonrakileri silmektir. Son kaydı tutmak istiyorsanız keep="last" yazarsınız; bu, tarihe göre sıralı verilerde en güncel kaydı korumak için kullanışlıdır. keep=False ise tekrar eden tüm satırları siler, hiçbirini bırakmaz; bu, tekrarın kendisinin hatalı olduğu durumlarda anlamlıdır.

Yalnız belirli sütunlara göre tekrar silmek için subset kullanın:

temiz = musteri.drop_duplicates(subset=["eposta"], keep="last")

Silme sonrası satır etiketleri (index) boşluklu kalır. Etiketleri yeniden sıfırdan numaralandırmak için ignore_index=True parametresini ya da sonradan reset_index(drop=True) çağrısını kullanın. inplace=True ile tabloyu yerinde değiştirebilirsiniz, ancak bu durumda yöntem None döndürür; yeni bir değişkene atamak daha okunabilir ve hatasızdır.

Pandas belgelerine göre tekrar saptanırken satır etiketleri (index) dikkate alınmaz; yalnız sütun değerleri karşılaştırılır. Bu, aynı değerleri taşıyan iki satırın farklı etiketlerde olsa bile tekrar sayılacağı anlamına gelir.

Doğru kaydı seçmek: kısmi tekrarlar

Gerçek veride tekrarlar sıklıkla birebir aynı değildir. Aynı müşteri farklı tarihlerle iki kez kaydedilmiş olabilir. Bu durumda "hangisini tutayım" iş sorusuna dönüşür. Çözüm, silmeden önce satırları kuralınıza göre sıralamaktır: örneğin en güncel kaydı tutmak için tarihe göre sıralayın, sonra eposta üzerinden drop_duplicates(subset=["eposta"], keep="last") uygulayın.

musteri = musteri.sort_values("kayit_tarihi") musteri = musteri.drop_duplicates(subset=["eposta"], keep="last")

Sıralamayı atlarsanız keep="last" yalnız dosyadaki sırayla son görülen kaydı tutar; bu, en güncel olan olmayabilir. Hangi kaydın doğru olduğuna iş kuralı karar verir: en güncel, en dolu ya da belirli bir kaynaktan gelen gibi.

Kayıtlar arasındaki farkları kaybetmek istemiyorsanız, silmek yerine gruplayıp birleştirmek daha uygun olabilir: groupby ile aynı anahtarın değerlerini toplayın, en son değeri alın ya da çelişkileri işaretleyin. Bu yaklaşım pandas ile veri birleştirme ve gruplama rehberlerinde ayrıntılı işlenir.

Silmeden önce kaç satırın etkileneceğini yazdırın ve silinecek örnekleri gözle kontrol edin. Veri kaynağınızda yanlış bir anahtar seçimi büyük kayıplara yol açar; bu yüzden orijinal tabloyu bir yedekte saklayın.

Gizli tekrarlar: yazım ve boşluk farkları

drop_duplicates değerleri birebir karşılaştırır. "Ayşe " ile "ayşe", "[email protected]" ile "[email protected]" pandas için farklı değerlerdir. Bu yüzden temizlikten önce karşılaştırılacak sütunları normalleştirin:

musteri["eposta"] = musteri["eposta"].str.strip().str.lower()

Boşlukları kırpmak, harf büyüklüğünü eşitlemek, gerekiyorsa Türkçe karakter ve noktalama farklarını gidermek, gizli tekrarları görünür kılar. Türkçe metinlerde büyük-küçük harf dönüşümünün i ve ı harfleri için beklenmedik sonuç verebileceğini unutmayın; ad ve soyad gibi alanlarda dönüşümü örnek verilerle kontrol edin.

Normalleştirme sonrasında bile birbirine çok benzeyen ama aynı olmayan kayıtlar kalabilir: yazım hatalı isimler, farklı biçimde yazılmış adresler. Bunlar için tam eşleşme değil, benzerlik tabanlı eşleştirme yöntemleri gerekir; bu daha ileri bir veri kalitesi konusudur ve drop_duplicates ile çözülmez.

Normalleştirmeyi sadece karşılaştırma için de yapabilirsiniz: orijinal sütunu bozmadan geçici bir anahtar sütunu üretin, tekrarları o anahtara göre silin, sonra anahtarı kaldırın. Bu, kaynak veriyi korur ve işlemi geri alınabilir kılar.

Sık yapılan hatalar

İlk hata, kontrolsüz silmektir. Hangi sütunlara göre tekrar arandığını ve kaç satırın silineceğini görmeden drop_duplicates çalıştırmak, veri kaybı riski taşır. İkinci hata, yanlış sütun kümesidir: tüm sütunlara bakan varsayılan davranış, tek bir alanı farklı olan kayıtları tekrar saymaz; yalnız anahtar sütuna bakmak ise farklı kayıtları yanlışlıkla siler.

Üçüncü hata, sıralamayı unutmaktır. keep="first" ya da "last", satırın dosyadaki konumuna bağlıdır; hangisinin "doğru" olduğu sıraya bağlıysa önce sıralayın. Dördüncü hata, sonucu atamamaktır: drop_duplicates varsayılan olarak yeni bir tablo döndürür, mevcut tablo değişmez.

Beşinci hata, yazım farklarını görmemektir; normalleştirmeden yapılan temizlik görünmeyen tekrarları bırakır. Altıncı hata, silme sonrası doğrulamayı atlamaktır. Satır sayısını, anahtar sütunun benzersizliğini (is_unique) ve toplamları kontrol edin.

Son olarak, sessizce silmek yerine kaç kaydın neden silindiğini kayıt altına alın. Veri hattında bu bilgi, ileride sayıların neden değiştiğini açıklamak için gerekir.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Veri bilimi programlarındaki pandas ve veri işleme modülleri, ham verinin analize hazırlanmasını uygulamalı olarak ele alır. Tekrar temizliği, veri analisti ve veri bilimci rolünde modelleme öncesi en sık karşılaşılan hazırlık adımlarından biridir.

İlgili Mindset programı

Data Science Bootcamp

Sık sorulanlar

Sık sorulan sorular

duplicated ile drop_duplicates arasındaki fark nedir?

duplicated, her satır için tekrar olup olmadığını gösteren bir boolean Series döndürür ve tabloyu değiştirmez. drop_duplicates ise tekrar eden satırları kaldırılmış yeni bir tablo döndürür. Silmeden önce duplicated ile tekrarları görüp incelemek güvenlidir.

Yalnız belirli bir sütuna göre tekrarı nasıl silerim?

subset parametresine sütun adını verin: df.drop_duplicates(subset=["eposta"]). Pandas yalnız bu sütunun değerlerine bakar ve diğer sütunlar farklı olsa bile tekrar sayar. Hangi kaydın kalacağını keep ile, gerekirse önceden sıralama ile belirleyin.

keep=False ne yapar?

Tekrar eden her satırı, ilk görülen dahil, tekrar olarak işaretler; drop_duplicates ile kullanıldığında bu satırların hepsi silinir, hiçbiri kalmaz. Tekrarın kendisinin hatalı olduğu durumlarda ya da duplicated ile tüm tekrarları incelemek için kullanışlıdır.

Silme sonrası satır numaraları neden boşluklu kalıyor?

drop_duplicates satır etiketlerini (index) korur, bu yüzden silinen satırların etiketleri eksik kalır. Etiketleri yeniden numaralandırmak için ignore_index=True parametresini ya da reset_index(drop=True) çağrısını kullanabilirsiniz.

Büyük-küçük harf farkı olan kayıtlar tekrar sayılır mı?

Hayır, pandas değerleri birebir karşılaştırır. "Ankara" ile "ankara" farklıdır. Önce str.strip ve str.lower gibi yöntemlerle sütunu normalleştirin, sonra tekrarları bulun. Türkçe karakterler için sonucu örnek verilerle kontrol edin.

Pandas ile Tekrar Eden Satırları Silme: drop_duplicates