Veri Tekrarlarından Arınma: Pandas drop_duplicates() Fonksiyonu
Veri analizi ve işleme süreçlerinde karşılaşılan en yaygın sorunlardan biri, veri setlerinde tekrar eden satırların veya değerlerin bulunmasıdır. Bu tekrarlar, analizlerin doğruluğunu olumsuz etkileyebilir, depolama alanını gereksiz yere artırabilir ve hesaplama maliyetlerini yükseltebilir. Pandas kütüphanesi, bu tür sorunları çözmek için güçlü ve esnek bir araç sunar: drop_duplicates() fonksiyonu. Bu rehberde, drop_duplicates() fonksiyonunun ne olduğunu, nasıl çalıştığını ve veri temizleme işlemlerinde nasıl etkin bir şekilde kullanılabileceğini detaylı bir şekilde inceleyeceğiz.
Veri Tekrarları Neden Bir Sorundur?
Tekrar eden veriler, genellikle veri girişi hataları, farklı kaynaklardan birleştirilen veriler veya sistemik aksaklıklar sonucunda ortaya çıkar. Bu tekrarların yol açtığı başlıca sorunlar şunlardır:
- Yanlış Analizler: Örneğin, bir müşteri listesindeki tekrar eden kayıtlar, müşteri sayısını veya ortalama harcamayı yanlış hesaplamanıza neden olabilir.
- Performans Düşüşü: Gereksiz büyük veri setleri, sorgu sürelerini uzatabilir ve işlemci/bellek kullanımını artırabilir.
- Veri Tutarsızlığı: Aynı varlığa ait farklı bilgiler içeren tekrar eden kayıtlar, veri tutarlılığını bozar.
Pandas’ın drop_duplicates() fonksiyonu, bu sorunları ortadan kaldırmak için tasarlanmıştır ve veri setinizi daha temiz, daha doğru ve daha verimli hale getirmenize yardımcı olur.
drop_duplicates() Fonksiyonuna Derinlemesine Bakış
drop_duplicates() fonksiyonu, bir DataFrame veya Series üzerindeki tekrar eden satırları veya değerleri belirleyip kaldırmak için kullanılır. Varsayılan olarak, fonksiyon tüm sütunları dikkate alarak tam olarak aynı olan satırları bulur ve bu satırlardan yalnızca ilkini korur.
Temel Kullanım ve Varsayılan Davranış
Bir DataFrame üzerinde drop_duplicates() fonksiyonunu herhangi bir parametre belirtmeden çağırdığınızda, Pandas tüm sütunlardaki değerleri karşılaştırır. Eğer iki satırın tüm sütunlarındaki değerler birebir aynıysa, bu satırlar tekrar eden olarak kabul edilir. Pandas, varsayılan olarak bu tekrar eden satır grubundan ilk karşılaştığı satırı korur ve diğerlerini siler.
Örnek bir DataFrame oluşturalım:
import pandas as pd
data = {
'Ad': ['Ali', 'Ayşe', 'Mehmet', 'Ali', 'Ayşe', 'Cem'],
'Soyad': ['Can', 'Yılmaz', 'Demir', 'Can', 'Yılmaz', 'Ak'],
'Yaş': [30, 25, 35, 30, 25, 28],
'Şehir': ['Ankara', 'İstanbul', 'İzmir', 'Ankara', 'İstanbul', 'Bursa']
}
df = pd.DataFrame(data)
print("Orijinal DataFrame:")
print(df)
Çıktı:
Orijinal DataFrame:
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
3 Ali Can 30 Ankara
4 Ayşe Yılmaz 25 İstanbul
5 Cem Ak 28 Bursa
Şimdi drop_duplicates() fonksiyonunu kullanalım:
df_temiz = df.drop_duplicates()
print("\nTekrarlardan Arındırılmış DataFrame (Varsayılan):")
print(df_temiz)
Çıktı:
Tekrarlardan Arındırılmış DataFrame (Varsayılan):
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
5 Cem Ak 28 Bursa
Gördüğünüz gibi, (Ali, Can, 30, Ankara) ve (Ayşe, Yılmaz, 25, İstanbul) satırları tekrar ettiği için, bu satırların ilk örnekleri korunmuş, diğerleri silinmiştir.
drop_duplicates() Fonksiyonunun Önemli Parametreleri
drop_duplicates() fonksiyonu, davranışını özelleştirmek için birkaç önemli parametre sunar:
subset Parametresi: Belirli Sütunlara Göre Tekrar Edenleri Bulma
subset parametresi, tekrar eden satırları belirlemek için hangi sütunların dikkate alınacağını belirtmenizi sağlar. Bu, genellikle tüm satırın tamamen aynı olmaması, ancak belirli anahtar sütunlarda tekrar etmesi durumunda çok kullanışlıdır. subset, bir sütun adı (string) veya sütun adlarından oluşan bir liste (list of strings) olarak verilebilir.
Örneğin, sadece ‘Ad’ ve ‘Soyad’ sütunlarına göre tekrar edenleri silmek isteyelim:
df_subset = df.drop_duplicates(subset=['Ad', 'Soyad'])
print("\n'Ad' ve 'Soyad' sütunlarına göre tekrarlardan arındırılmış DataFrame:")
print(df_subset)
Çıktı:
'Ad' ve 'Soyad' sütunlarına göre tekrarlardan arındırılmış DataFrame:
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
5 Cem Ak 28 Bursa
Bu örnekte, ‘Ali Can’ ve ‘Ayşe Yılmaz’ kombinasyonları tekrar ettiği için, diğer sütunlardaki değerler farklı olsa bile, bu kombinasyonların ilk örnekleri korunmuştur.
keep Parametresi: Hangi Tekrar Eden Kaydın Korunacağını Belirleme
keep parametresi, tekrar eden bir grup içinde hangi satırın korunacağını kontrol eder. Üç olası değeri vardır:
'first'(Varsayılan): Tekrar eden gruptaki ilk gözlemi korur.'last': Tekrar eden gruptaki son gözlemi korur.False: Tekrar eden gruptaki tüm gözlemleri siler, yani yalnızca tamamen benzersiz (başka hiçbir satırla eşleşmeyen) satırları bırakır.
keep='last' örneği:
df_keep_last = df.drop_duplicates(keep='last')
print("\nSon tekrarı koruyarak tekrarlardan arındırılmış DataFrame:")
print(df_keep_last)
Çıktı:
Son tekrarı koruyarak tekrarlardan arındırılmış DataFrame:
Ad Soyad Yaş Şehir
2 Mehmet Demir 35 İzmir
3 Ali Can 30 Ankara
4 Ayşe Yılmaz 25 İstanbul
5 Cem Ak 28 Bursa
Burada, (Ali, Can, 30, Ankara) satırının 0. indeksteki yerine 3. indeksteki, (Ayşe, Yılmaz, 25, İstanbul) satırının 1. indeksteki yerine 4. indeksteki örneği korunmuştur.
keep=False örneği:
df_keep_false = df.drop_duplicates(keep=False)
print("\nTüm tekrar edenleri silerek tamamen benzersiz satırlar:")
print(df_keep_false)
Çıktı:
Tüm tekrar edenleri silerek tamamen benzersiz satırlar:
Ad Soyad Yaş Şehir
2 Mehmet Demir 35 İzmir
5 Cem Ak 28 Bursa
Bu durumda, Ali Can ve Ayşe Yılmaz’a ait tüm kayıtlar silinmiştir, çünkü bu kayıtlar birden fazla kez geçiyordu. Sadece Mehmet Demir ve Cem Ak’a ait kayıtlar benzersiz olduğu için kalmıştır.
inplace Parametresi: Değişiklikleri Orijinal DataFrame’e Uygulama
inplace parametresi, işlemin orijinal DataFrame üzerinde mi yoksa yeni bir DataFrame döndürülerek mi yapılacağını kontrol eder.
False(Varsayılan): İşlem sonucunda yeni bir DataFrame döndürür ve orijinal DataFrame’i değiştirmez.True: İşlemi doğrudan orijinal DataFrame üzerinde gerçekleştirir veNonedöndürür. Bu, bellek açısından daha verimli olabilir ancak dikkatli kullanılmalıdır, çünkü orijinal verinizi geri döndürülemez bir şekilde değiştirir.
print("\ninplace=True ile orijinal DataFrame'i değiştirme:")
df.drop_duplicates(inplace=True)
print(df)
Çıktı:
inplace=True ile orijinal DataFrame'i değiştirme:
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
5 Cem Ak 28 Bursa
Bu işlemden sonra df artık tekrarlardan arındırılmış haldedir.
ignore_index Parametresi: İndeksi Sıfırlama
ignore_index parametresi, tekrar eden satırlar silindikten sonra kalan DataFrame’in indeksini sıfırlayıp sıfırlamayacağını kontrol eder.
False(Varsayılan): Orijinal indeks değerlerini korur.True: Yeni DataFrame’in indeksini 0’dan başlayarak sıfırlar. Bu, indeksin sıralı ve kesintisiz olmasını istediğinizde kullanışlıdır.
df_reset_index = pd.DataFrame(data).drop_duplicates(ignore_index=True)
print("\nİndeksi sıfırlanmış tekrarlardan arındırılmış DataFrame:")
print(df_reset_index)
Çıktı:
İndeksi sıfırlanmış tekrarlardan arındırılmış DataFrame:
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
3 Cem Ak 28 Bursa
Varsayılan drop_duplicates() çıktısındaki indeks (0, 1, 2, 5) yerine, ignore_index=True ile (0, 1, 2, 3) şeklinde sıralı bir indeks elde ettik.
Pratik Kullanım Senaryoları ve İpuçları
drop_duplicates() fonksiyonunu veri temizleme görevlerinizde daha etkin kullanmanıza yardımcı olacak bazı pratik senaryolar ve ipuçları:
1. Sadece Belirli Bir Sütunda Tekrar Eden Değerleri Temizleme
Bazen sadece belirli bir anahtar sütundaki (örneğin, ‘E-posta Adresi’ veya ‘Kullanıcı Kimliği’) tekrarları temizlemek istersiniz.
data_users = {
'UserID': [101, 102, 103, 101, 104],
'Email': ['a@x.com', 'b@y.com', 'c@z.com', 'a@x.com', 'd@w.com'],
'LastLogin': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']
}
df_users = pd.DataFrame(data_users)
print("Orijinal Kullanıcı DataFrame:")
print(df_users)
UserID'ye göre tekrar edenleri sil, en son girişi koru
df_unique_users = df_users.drop_duplicates(subset=['UserID'], keep='last', ignore_index=True)
print("\nUserID'ye göre benzersiz kullanıcılar (son giriş korunarak):")
print(df_unique_users)
Çıktı:
Orijinal Kullanıcı DataFrame:
UserID Email LastLogin
0 101 a@x.com 2023-01-01
1 102 b@y.com 2023-01-02
2 103 c@z.com 2023-01-03
3 101 a@x.com 2023-01-04
4 104 d@w.com 2023-01-05
UserID'ye göre benzersiz kullanıcılar (son giriş korunarak):
UserID Email LastLogin
0 102 b@y.com 2023-01-02
1 103 c@z.com 2023-01-03
2 101 a@x.com 2023-01-04
3 104 d@w.com 2023-01-05
Burada, UserID=101 için iki kayıt vardı. keep='last' sayesinde, 2023-01-04 tarihli son giriş bilgisi korunmuştur.
2. Tekrar Eden Satırları Sildikten Sonra İndeks Yönetimi
drop_duplicates() işlemi, bazı satırları kaldırdığı için orijinal indeksin sıralamasını bozabilir. Eğer sonraki işlemlerinizde sıralı bir indekse ihtiyacınız varsa, reset_index(drop=True) kullanarak indeksi sıfırlayabilirsiniz. ignore_index=True parametresi, drop_duplicates() ile aynı anda bu işlemi yapar.
df_temp = pd.DataFrame(data)
df_cleaned = df_temp.drop_duplicates().reset_index(drop=True)
print("\nTekrarlardan arındırılmış ve indeksi sıfırlanmış DataFrame (reset_index ile):")
print(df_cleaned)
Çıktı:
Tekrarlardan arındırılmış ve indeksi sıfırlanmış DataFrame (reset_index ile):
Ad Soyad Yaş Şehir
0 Ali Can 30 Ankara
1 Ayşe Yılmaz 25 İstanbul
2 Mehmet Demir 35 İzmir
3 Cem Ak 28 Bursa
3. Tekrarları Tespit Etme (duplicated())
drop_duplicates() fonksiyonunu çalıştırmadan önce, veri setinizde kaç tane tekrar eden satır olduğunu görmek isteyebilirsiniz. Bunun için duplicated() fonksiyonunu kullanabilirsiniz. duplicated() fonksiyonu, her satır için bir boolean Series döndürür; True değeri, o satırın daha önceki bir satırla tekrar ettiğini gösterir.
print("\nTekrar eden satırları tespit etme (duplicated()):")
print(df.duplicated()) # df, inplace=True ile değiştirildiği için yeni df kullanmak daha doğru
temp_df = pd.DataFrame(data) # Orijinal veri setini tekrar oluşturalım
print(temp_df.duplicated())
Tekrar eden satırları görüntüleme
print("\nTekrar eden satırlar (ikinci ve sonraki örnekler):")
print(temp_df[temp_df.duplicated()])
keep='last' ile duplicated() kullanmak
print("\nTekrar eden satırları tespit etme (keep='last' ile):")
print(temp_df.duplicated(keep='last'))
keep=False ile duplicated() kullanmak
print("\nTekrar eden satırları tespit etme (keep=False ile):")
print(temp_df.duplicated(keep=False))
Çıktı:
Tekrar eden satırları tespit etme (duplicated()):
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
Tekrar eden satırlar (ikinci ve sonraki örnekler):
Ad Soyad Yaş Şehir
3 Ali Can 30 Ankara
4 Ayşe Yılmaz 25 İstanbul
Tekrar eden satırları tespit etme (keep='last' ile):
0 True
1 True
2 False
3 False
4 False
5 False
dtype: bool
Tekrar eden satırları tespit etme (keep=False ile):
0 True
1 True
2 False
3 True
4 True
5 False
dtype: bool
duplicated(keep=False) ile, tekrar eden herhangi bir grubun parçası olan tüm satırları True olarak işaretleyerek, tamamen benzersiz satırları kolayca filtreleyebilirsiniz.
Performans ve Büyük Veri Kümeleri
Büyük veri kümeleriyle çalışırken drop_duplicates() fonksiyonunun performansı önemli olabilir. İşlem süresi, DataFrame’in boyutu, sütun sayısı ve tekrar eden satırların dağılımına bağlı olarak değişir.
* Bellek Kullanımı: drop_duplicates() işlemi, dahili olarak bir hash tablosu veya sıralama algoritması kullanabilir. Bu, özellikle çok sayıda sütun veya büyük metin alanları içeren veri setleri için önemli miktarda bellek tüketebilir.
* Sütun Seçimi (subset): Mümkünse, subset parametresini kullanarak tekrar edenleri kontrol etmek için sadece gerekli sütunları belirtin. Bu, karşılaştırma maliyetini düşürerek performansı artırabilir. Daha az sütun üzerinde hashleme veya sıralama yapmak, tüm sütunlar üzerinde yapmaktan daha hızlıdır.
* inplace=True Kullanımı: inplace=True kullanmak, yeni bir DataFrame oluşturma maliyetinden kaçınmanızı sağlar ve büyük veri setleri için bellek açısından daha verimli olabilir. Ancak, orijinal veriyi geri döndürülemez bir şekilde değiştirdiği için dikkatli kullanılmalıdır.
Genel olarak, Pandas drop_duplicates() fonksiyonu çoğu durumda oldukça optimize edilmiş ve hızlı çalışır. Ancak milyonlarca satır ve yüzlerce sütun içeren çok büyük veri setlerinde, işlem süresini ve bellek kullanımını izlemek ve gerekirse yukarıdaki ipuçlarını uygulamak faydalı olacaktır.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Pandas drop_duplicates() fonksiyonu, veri temizleme ve ön işleme adımlarının vazgeçilmez bir parçasıdır. Veri setlerinizdeki gereksiz tekrarları ortadan kaldırarak analizlerinizin doğruluğunu artırır, depolama ve işleme verimliliğini iyileştirir. subset, keep, inplace ve ignore_index gibi parametreleri kullanarak, bu fonksiyonu kendi özel ihtiyaçlarınıza göre esnek bir şekilde uyarlayabilirsiniz.
Sıkça Sorulan Sorular (SSS)
1. drop_duplicates() ile unique() arasındaki fark nedir?
drop_duplicates() bir DataFrame veya Series’ten tekrar eden satırları veya değerleri kaldırır ve geriye bir DataFrame veya Series döndürür. Örneğin, df.drop_duplicates() tüm tekrar eden satırları siler. Series.unique() ise bir Series’teki tüm benzersiz değerleri bir NumPy dizisi olarak döndürür. Sadece bir sütundaki benzersiz değerleri görmek istediğinizde df['SütunAdı'].unique() kullanırsınız.
2. Sadece belirli sütunlarda tekrar edenleri nasıl bulurum?
subset parametresini kullanarak belirli sütunları belirtebilirsiniz. Örneğin, df.drop_duplicates(subset=['UserID', 'TransactionID']) sadece ‘UserID’ ve ‘TransactionID’ sütunlarında aynı olan satırları dikkate alacaktır.
3. Tekrar eden satırları sildikten sonra indeks neden bozulur ve nasıl düzeltirim?
drop_duplicates() fonksiyonu, satırları kaldırdığı için orijinal indeks değerleri arasında boşluklar oluşabilir. Örneğin, 0, 1, 2, 5 gibi bir indeksiniz olabilir. Bunu düzeltmek ve sıralı, kesintisiz bir indeks elde etmek için ignore_index=True parametresini kullanabilir veya işlemi yaptıktan sonra reset_index(drop=True) çağırabilirsiniz.
4. NaN (Not a Number) değerleri drop_duplicates() tarafından nasıl ele alınır?
Pandas drop_duplicates(), NaN değerlerini birbirine eşit kabul eder. Yani, iki farklı satırda aynı sütunda NaN varsa, bu iki satırın o sütun değeri açısından tekrar ettiği kabul edilir. Örneğin, [1, NaN] ve [1, NaN] iki tekrar eden satır olarak değerlendirilir.
5. drop_duplicates() kullanmadan önce kaç tane tekrar eden satır olduğunu nasıl öğrenebilirim?
duplicated() fonksiyonunu kullanabilirsiniz. df.duplicated().sum() size tekrar eden (yani ilk örnek dışındaki) satır sayısını verir. Eğer keep=False davranışını simüle etmek isterseniz, df.duplicated(keep=False).sum() size tekrar eden bir grubun parçası olan tüm satırların sayısını verecektir.