Veri Seçme, Filtreleme ve Sıralama
Bu ders yaklaşık 13 dakika sürer ve serimizin altıncı dersidir. Bir önceki derste DataFrame ve Series yapılarıyla temel işlemleri, sütun ve satır kavramlarını öğrenmiştik; şimdi o bilgiyi kullanarak veri içinde gezinmeyi, aradığımızı bulmayı ve düzenlemeyi öğreneceğiz. Bir sonraki derste ise seçtiğimiz ve filtrelediğimiz verileri gruplayıp özetlemeyi (gruplama ve toplulaştırma) ele alacağız; bu yüzden bugünkü konuyu iyi kavramak bir sonraki adımı çok kolaylaştıracaktır.
Bu derste ne yapacağız?
Bu dersin hedefi, elinizdeki bir pandas DataFrame'i içinde istediğiniz satır ve sütunlara doğrudan ulaşabilecek, belirli koşulları sağlayan kayıtları filtreleyebilecek ve verileri istediğiniz sıraya dizebilecek düzeye getirmektir. Dersin sonunda binlerce satırlık bir tablodan saniyeler içinde tam istediğiniz bilgiyi çekebileceksiniz.
Ön koşul olarak, önceki derste gördüğümüz DataFrame kavramını, sütun adlarını ve pandas kütüphanesinin pd takma adıyla içe aktarıldığını bilmeniz yeterlidir. Ayrıca bilgisayarınızda Python ve pandas kurulu olmalı; bunu daha önceki derslerde kurmuştuk.
Kavram
Bir DataFrame'i büyük bir sınıf listesi gibi düşünebilirsiniz: her satır bir öğrenciyi, her sütun ise ad, yaş, not gibi bir özelliği temsil eder. Bazen bu listede sadece belirli öğrencilerin bilgisine ihtiyaç duyarsınız (örneğin sadece 7. sınıftakiler), bazen sadece belirli sütunlara bakmak istersiniz (örneğin sadece ad ve not sütunu), bazen de listeyi nota göre büyükten küçüğe sıralamak istersiniz. İşte seçme, filtreleme ve sıralama tam olarak bu üç günlük ihtiyaca karşılık gelir.
Seçme (selection), tablodan belirli sütun veya satırları çekmek demektir; kütüphanedeki bir kitabı rafın tamamını taşımadan sadece istediğiniz kitabı almaya benzer. Filtreleme (filtering) ise bir koşula göre eleme yapmaktır; örneğin bir markette sadece indirimdeki ürünleri görmek gibi. Sıralama (sorting) ise verileri belirli bir sütuna göre küçükten büyüğe veya büyükten küçüğe dizmektir; bir yarışmada sporcuları derecelerine göre sıralamaya benzer.
Adım adım uygulama
1) Sütun seçme. Bir DataFrame içinden tek bir sütunu köşeli parantez ile seçebilirsiniz. Örneğin elinizde ogrenciler adında bir DataFrame varsa, sadece isim sütununu almak için şu kodu yazarsınız: ogrenciler['isim']. Bu işlem size o sütunu bir Series olarak döndürür. Birden fazla sütun seçmek isterseniz köşeli parantezin içine bir liste verirsiniz: ogrenciler[['isim', 'not']]. Buradaki çift köşeli parantezin nedeni, içteki köşeli parantezin bir liste oluşturması, dıştaki köşeli parantezin ise o listeyi DataFrame'e sütun adı olarak vermesidir.
2) Satır seçme ile loc ve iloc. pandas'ta satır seçmek için iki temel araç vardır: loc ve iloc. loc, satırları etiket yani isim veya indeks değerine göre seçer; iloc ise satırları sıra numarasına yani konumuna göre seçer. Örneğin ogrenciler.loc[3] indeks değeri 3 olan satırı getirir, ogrenciler.iloc[3] ise tablodaki dördüncü satırı (0'dan saydığımız için) getirir. Genelde indeksiniz sıra numarasıyla aynıysa iki kod da aynı sonucu verir, ama indeksi değiştirdiğinizde fark ortaya çıkar. Belirli bir satır ve sütun kombinasyonu için ise şu şekilde yazarsınız: ogrenciler.loc[3, 'isim'].
3) Koşula göre filtreleme. pandas'ta filtreleme, bir koşul yazıp bu koşulu DataFrame'in köşeli parantezine vermekle yapılır. Örneğin sadece notu 70'in üzerinde olan öğrencileri görmek için şu kodu yazarsınız: ogrenciler[ogrenciler['not'] > 70]. Burada önce ogrenciler['not'] > 70 ifadesi her satır için Doğru veya Yanlış değeri üreten bir Series oluşturur; sonra bu Doğru/Yanlış listesi DataFrame'e verilerek sadece Doğru olan satırlar tutulur. Bu yönteme boolean maskeleme denir.
4) Birden fazla koşul birleştirme. İki veya daha fazla koşulu aynı anda kullanmak isterseniz and ve or yerine & (ve) ile | (veya) işaretlerini kullanmanız ve her koşulu parantez içine almanız gerekir. Örneğin notu 70'in üzerinde ve sınıfı 8 olan öğrencileri bulmak için: ogrenciler[(ogrenciler['not'] > 70) & (ogrenciler['sinif'] == 8)]. Parantezler burada zorunludur, çünkü parantez olmadan pandas işlem sırasını doğru anlayamaz ve hata verir.
5) Metin tabanlı filtreleme. Bir sütunda geçen metne göre filtreleme yapmak isterseniz str.contains yöntemini kullanabilirsiniz. Örneğin ismi 'ay' harflerini içeren öğrencileri bulmak için: ogrenciler[ogrenciler['isim'].str.contains('ay')]. Bu, büyük küçük harf duyarlıdır; duyarsız hale getirmek için parantez içine case=False parametresini eklersiniz.
6) Sıralama. Verileri bir sütuna göre sıralamak için sort_values yöntemi kullanılır. Notlara göre küçükten büyüğe sıralamak için: ogrenciler.sort_values('not'). Büyükten küçüğe sıralamak isterseniz ascending=False parametresini eklersiniz: ogrenciler.sort_values('not', ascending=False). Birden fazla sütuna göre sıralamak isterseniz sütun adlarını bir liste içinde verirsiniz: ogrenciler.sort_values(['sinif', 'not'], ascending=[True, False]). Bu örnekte önce sınıfa göre küçükten büyüğe, aynı sınıf içinde ise nota göre büyükten küçüğe sıralama yapılır.
7) Sonucu kalıcı hale getirme. Filtreleme veya sıralama işlemleri varsayılan olarak orijinal DataFrame'i değiştirmez, size yeni bir DataFrame döndürür. Bu sonucu saklamak isterseniz yeni bir değişkene atamanız gerekir: basarili_ogrenciler = ogrenciler[ogrenciler['not'] > 70]. Bu şekilde orijinal veriniz bozulmadan kalır ve istediğiniz zaman tekrar kullanabilirsiniz.
Sık karşılaşılan sorunlar
| Hata veya Sorun | Olası Neden | Çözüm |
|---|---|---|
| KeyError: 'sutun_adi' | Sütun adı yanlış yazılmış veya sütun tabloda yok | Sütun adlarını ogrenciler.columns komutuyla kontrol edin, boşluk ve büyük/küçük harf farkına dikkat edin |
| ValueError: The truth value of a Series is ambiguous | Birden fazla koşul and/or ile birleştirilmiş, parantez unutulmuş | and yerine &, or yerine | kullanın ve her koşulu parantez içine alın |
| Filtreleme sonucu boş DataFrame döndü | Koşul hiçbir satırla eşleşmiyor, veri tipi uyuşmuyor (örneğin metinle sayı karşılaştırılıyor) | Sütunun veri tipini ogrenciler.dtypes ile kontrol edin, koşul değerini gözden geçirin |
| Sıralama işe yaramadı gibi görünüyor | Sonuç yeni bir değişkene atanmamış | sort_values sonucunu bir değişkene atayın veya inplace=True parametresini kullanın |
| SettingWithCopyWarning uyarısı | Filtrelenmiş bir DataFrame üzerinde doğrudan değişiklik yapılmaya çalışılıyor | Filtrelenmiş veriyi değiştirmeden önce .copy() ile açık bir kopya oluşturun |
Mini görev
Elinizde bir ürün satış tablosu olduğunu hayal edin; sütunlar urun_adi, kategori, fiyat ve stok olsun. Bu tabloyu daha önceki derste öğrendiğiniz şekilde bir sözlükten DataFrame olarak oluşturun veya elinizdeki örnek bir CSV dosyasını okuyun. Ardından şu adımları uygulayın: sadece urun_adi ve fiyat sütunlarını seçip ekrana yazdırın; fiyatı 100'den yüksek olan ürünleri filtreleyip yeni bir değişkende saklayın; stoku 5'in altında olan ve kategorisi 'Elektronik' olan ürünleri iki koşulu birleştirerek bulun; son olarak tüm tabloyu fiyata göre büyükten küçüğe sıralayıp ilk beş satırı görüntüleyin.
Kontrol listesi:
- İki sütunu birlikte seçerken çift köşeli parantez kullandım mı?
- Tek koşullu filtrelemede boolean maskeleme mantığını doğru uyguladım mı?
- Birden fazla koşulu birleştirirken & işaretini ve parantezleri kullandım mı?
- Sıralama sonucunu bir değişkene atadım mı yoksa sadece ekrana mı yazdırdım?
- Sonuçların beklediğim gibi olup olmadığını satır sayısına bakarak kontrol ettim mi?
Kendini sına
1) Bir DataFrame'den birden fazla sütun seçmek için hangi sözdizimi doğrudur?
2) loc ile iloc arasındaki temel fark nedir?
3) Notu 60'ın altında olan öğrencileri filtrelemek için hangi kod satırı yazılır?
4) İki koşulu aynı anda kullanırken neden parantez kullanmak zorunludur?
5) Bir DataFrame'i bir sütuna göre büyükten küçüğe sıralamak için hangi yöntem ve hangi parametre kullanılır?
Cevaplar
1) Sütun adlarını bir liste içinde çift köşeli parantezle vermek gerekir, örneğin ogrenciler[['isim', 'not']].
2) loc satırları etiket veya indeks değerine göre seçer, iloc ise satırları sıra numarasına yani konumuna göre seçer.
3) ogrenciler[ogrenciler['not'] < 60] kodu yazılır; bu, boolean maskeleme ile notu 60'ın altında olan satırları getirir.
4) Parantez kullanılmazsa Python işlem önceliğini pandas'ın beklediği şekilde yorumlayamaz ve ValueError hatası verir; parantezler her koşulun ayrı ayrı değerlendirilmesini garanti eder.
5) sort_values yöntemi kullanılır ve büyükten küçüğe sıralamak için ascending=False parametresi eklenir.
Bu dersle artık büyük veri tablolarında istediğiniz bilgiyi hızlıca bulabilir, gereksiz satırları eleyebilir ve verinizi anlamlı bir sırayla düzenleyebilirsiniz. Bir sonraki derste bu becerileri bir adım öteye taşıyarak verileri kategorilere göre gruplayacak ve her grup için ortalama, toplam gibi özet istatistikler hesaplamayı öğreneceğiz; bu yüzden sort_values ve boolean maskeleme mantığını iyi pekiştirmeniz faydalı olacaktır.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol