Pandas'ta İleri Seviye İpuçları ve Sık Yapılan Hatalar: Sessizce Yanlış Sonuç Veren Tuzaklar
Pandas'ta Sessizce Yanlış Sonuç Veren Tuzaklar
Bu derste hata mesajı vermeyen ama yanlış sonuç üreten durumlara bakacağız. Bunlar en tehlikeli hatalardır, çünkü rapor yöneticiye gitmeden önce kimse fark etmez. Amaç, her tuzağı tanımak ve her biri için küçük bir kontrol alışkanlığı edinmektir.
1. Zincirleme atama ve SettingWithCopy
Tuzak: df[df['sehir']=='Ankara']['maas'] = 0 gibi iki köşeli parantezle atama yapmak. İlk parantez bir görünüm ya da kopya döndürür. Atama asıl tabloya ulaşmayabilir. Uyarı çıkabilir, ama çıkmayabilir de.
- Tek adımda yazın: df.loc[df['sehir']=='Ankara', 'maas'] = 0
- Bağımsız bir alt küme istiyorsanız açıkça .copy() kullanın.
- Atamadan sonra tabloya bakın. Değişiklik gerçekten oldu mu?
- Pandas sürümünüzde Copy-on-Write açıksa davranış daha öngörülebilirdir. Yine de .loc alışkanlığını koruyun.
2. Birleştirmede (merge) beklenmeyen satır çoğalması
Tuzak: Anahtar sütunda tekrar eden değerler varsa her eşleşme ayrı satır üretir. Satış tablosunu müşteri tablosuyla birleştirirsiniz, müşteri tablosunda aynı müşteri iki kez geçer. Toplam ciro sessizce şişer.
- Birleştirmeden önce anahtarın benzersizliğini kontrol edin: df['musteri_id'].is_unique
- Doğrulamayı merge'e yaptırın: validate='m:1' yazarsanız anahtar tekrar ederse Pandas hata verir.
- Sonuçta satır sayısını karşılaştırın. Soldaki tablo 1000 satırsa ve left join yaptıysanız sonuç da 1000 olmalıdır.
- Eşleşmeyenleri görmek için indicator=True kullanın.
3. groupby'da eksik değerlerin dışarıda kalması
Tuzak: groupby varsayılan olarak anahtarı boş olan satırları atar. Bölge bilgisi girilmemiş satırlar hiçbir grupta görünmez. Grup toplamları genel toplamdan küçük çıkar ve kimse sormaz.
- dropna=False ile boş anahtarlı grubu da görün.
- Grup toplamlarının toplamını genel toplamla karşılaştırın.
- Bu karşılaştırma tek satırlık bir kontrol toplamıdır.
4. Yerel ayar kaynaklı hatalar
| Sorun | Belirti | Çözüm |
|---|---|---|
| Ondalık virgül (1.234,56) | Sütun sayı yerine metin olur ya da değerler 100 kat kayar | Okurken decimal=',' ve thousands='.' kullanın |
| Tarih biçimi (gün/ay/yıl) | 03/04/2026 yanlışlıkla 4 Mart okunur | pd.to_datetime(..., format='%d/%m/%Y') yazın, tahmine bırakmayın |
| Büyük İ ve ı harfi | 'ISPARTA', 'Isparta' ve 'ısparta' ayrı gruplar olur; Python'un lower() işlevi 'İ'yi doğru küçültmez | Önce özel bir eşleme ile 'İ'→'i', 'I'→'ı' dönüştürün, sonra küçültün; ardından str.strip() uygulayın |
Kural: Dosyayı okur okumaz df.dtypes ve df.head() ile bakın. Sayı olması gereken sütun 'object' çıktıysa bir sorun vardır.
5. Ortalama mı, medyan mı?
Tuzak: Maaş, sipariş tutarı ve teslimat süresi gibi çarpık dağılan verilerde birkaç uç değer ortalamayı çeker. Yöneticiye 'ortalama maaş' diye sunulan rakam kimsenin gerçek maaşına benzemez.
- Ortalama ve medyanı yan yana yazın. Aralarındaki fark büyükse dağılım çarpıktır.
- Çarpık veride rapor için medyanı seçin. Toplam tutar gerekiyorsa ortalama yine anlamlıdır.
- Aykırı değeri otomatik silmeyin. Önce veri girişi hatası mı, gerçek bir uç durum mu diye bakın.
- describe() çıktısında en büyük değere bakın.
6. Doğruluğu ölçmek: kontrol listesi
- Satır sayısı: Her adımdan önce ve sonra len(df) yazdırın.
- Kontrol toplamı: Ciro gibi ana sütunun toplamı, kaynak ile sonuç tabloda aynı mı?
- Benzersizlik: Kimlik sütunları gerçekten benzersiz mi?
- Eksik değer sayısı: df.isna().sum() adım öncesi ve sonrasında nasıl değişti?
- assert testi: assert len(sonuc) == len(sol_tablo) gibi satırlar kodu çalıştırdığınızda sessiz hatayı sesli hataya çevirir.
7. Bir üst seviye: büyük dosya, fonksiyon, tekrarlanabilirlik
- Bellek: Tekrar eden metin sütunlarını category tipine çevirin. Gereksiz sütunları usecols ile hiç okumayın. Çok büyük dosyaları chunksize ile parça parça işleyin. Önce df.memory_usage(deep=True) ile ölçün.
- Fonksiyonlara bölün: oku(), temizle(), birlestir(), ozetle() gibi küçük fonksiyonlar yazın. Her birinin sonunda kendi kontrolü olsun.
- Tekrarlanabilirlik: Ham veriyi asla üzerine yazmayın. Tüm adımları tek bir betik ya da not defterinde baştan sona çalışır halde tutun. Rastgelelik varsa tohum değeri sabitleyin. Kullandığınız Pandas sürümünü bir not dosyasına yazın.
Şablon: her analizin sonuna ekleyin
- Kaynak satır sayısı = sonuç satır sayısı (beklenen farkla birlikte) mı?
- Ana sütunun toplamı eşleşiyor mu?
- Anahtar sütunlarda tekrar ya da eksik var mı?
- Sayı ve tarih sütunlarının tipi doğru mu?
- Ortalama ve medyan birbirine yakın mı?
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol
İpucu: ← ve → tuşlarıyla dersler arasında geçebilirsin.