Pandas 08 - Veri Filtreleme Yöntemleri

Filtreleme Yöntemleri

Pandas kütüphanesi ile en sık yapılan işlemlerden biri de Filtreleme işlemidir. Binlerce, onbinlerce hatta milyonlarca kayıt arasından istediğimize ulaşmak için filreleme komutlarını kullanacağız. Bu bölümdeki anlatılanları da dikkatle okuyup öğrenmenizi tavsiye ederim.

Karşılaştırma Operatorü Kullanımı

Sütun içerisindeki verilere göre filtreleme uygulamak istersek, VeriCervecesiAdı["SütunAdı"] == "Filtre_Kriteri" yöntemi kullanılabilir.

Pythonda kullanıdığımız Karşılaştırma operatörlerini (< , > , <=, >=, ==, !=, ) ve Mantıksal Operatörleri ( (and, ve) & ve (or, Ya da) | Pandas içerisinde de kullanabiliriz. Öncelikle veri çerçevemize göz atalım.

import pandas as pd
imdb = pd.read_excel("Veri_Setleri/imdb.xlsx", decimal=",")
print(imdb)
Film_Adı Yıl Puan Oylayan_Kişi
0 The Shawshank Redemption 1994 9.2 1071904
1 The Godfather 1972 9.2 751381
2 The Godfather: Part II 1974 9.0 488889
3 Pulp Fiction 1994 8.9 830504
4 The Dark Knight 2008 8.9 1045186
... ... ... ... ...
242 Mystic River 2003 7.9 256159
243 In the Heat of the Night 1967 7.9 37081
244 Arsenic and Old Lace 1944 7.9 45893
245 Before Sunrise 1995 7.9 100974
246 Papillon 1973 7.9 62517

247 rows × 4 columns

Örneğin 2010 yılına ait filmleri görmek istersen Karşılaştırma operatörünü kullanarak aşağıdaki filtreleme yöntemini kullanabiliriz.

imdb = pd.read_excel("Veri_Setleri/imdb.xlsx", decimal=",")
print(imdb[imdb["Yıl"] == 2010])
Film_Adı Yıl Puan Oylayan_Kişi
14 Inception 2010 8.7 844938
63 Toy Story 3 2010 8.4 320991
166 How to Train Your Dragon 2010 8.1 249971
177 The King's Speech 2010 8.1 288159
194 Black Swan 2010 8.0 373745
231 Shutter Island 2010 8.0 436151
233 Incendies 2010 8.0 36751

Yukarıdaki yazım tarzı kafanızı karıştırdıysa, aşağıdaki (parçalara ayrılmış) yazım tarzı daha anlaşılır gelebilir. Önce filtreyi tanımlıyor, sonra veri çerçevesine dahil ediyoruz.

filtre_2010 = imdb["Yıl"] == 2010
print(imdb[filtre_2010])
Film_Adı Yıl Puan Oylayan_Kişi
14 Inception 2010 8.7 844938
63 Toy Story 3 2010 8.4 320991
166 How to Train Your Dragon 2010 8.1 249971
177 The King's Speech 2010 8.1 288159
194 Black Swan 2010 8.0 373745
231 Shutter Island 2010 8.0 436151
233 Incendies 2010 8.0 36751

8,8 ve üzeri Puana sahip filmleri listelemek istersek;

filtre_88 = imdb["Puan"] >= 8.8
print(imdb[filtre_88])
Film_Adı Yıl Puan Oylayan_Kişi
0 The Shawshank Redemption 1994 9.2 1071904
1 The Godfather 1972 9.2 751381
2 The Godfather: Part II 1974 9.0 488889
3 Pulp Fiction 1994 8.9 830504
4 The Dark Knight 2008 8.9 1045186
5 12 Angry Men 1957 8.9 264112
6 Schindler's List 1993 8.9 545703
7 The Lord of the Rings: The Return of the King 2003 8.8 758388
8 Fight Club 1999 8.8 814389
9 Star Wars: Episode V - The Empire Strikes Back 1980 8.8 519895
10 The Lord of the Rings: The Fellowship of the R... 2001 8.8 784999

Karşılaştırma operatorlerini, Filtreleme işlemini dışında kıyaslama amacıyla da kullanabiliriz. Aşağıdaki kullanımı inceleyelim.

Mantiksal_imdb = imdb["Puan"] > 8
print(Mantiksal_imdb)
0       True
1       True
2       True
3       True
4       True
       ...  
242    False
243    False
244    False
245    False
246    False
Name: Puan, Length: 247, dtype: bool

Bu durumda, Puan sütunundaki değerler, verilen kritere göre (8'den büyük olup olmadığı) sorgulanıyor ve her değer için True (Doğru) yani değer 8'den büyük ya da False (yanlış) yani değer 8'e eşit ya da küçük sonucu vdöndürüyor.

between() Fonksiyonu

Bir sayısal aralık belirterek filtreleme yapmak istersek between() metodunu kullanabiliriz. Örneği 1960 ile 1980 yılları arasındaki filmleri filtrelemeye çalışalım.

print(imdb["Yıl"].between(1960,1980))
0      False
1       True
2       True
3      False
4      False
       ...  
242    False
243     True
244    False
245    False
246     True
Name: Yıl, Length: 247, dtype: bool

Mantıksal Operatör Kullanımı

Birden fazla kriter içeren filtreleme işlemi uygulamak istersek, aşağıdaki kodlar ile istediğimiz elde edebiliriz. İki kriteri bir arada kullanmak istediğimizde VE (and) simgesi olan &, İki kriterden birini ayrı ayrı seçmek için YA DA (or) simgesi olan | kullanılır. and ve or kelimelerini kullanırsanız hata alırsınız.

yıl_2000den_buyuk = imdb["Yıl"] > 2000
Oylayan_Kişi_500000 = imdb["Oylayan_Kişi"] > 500000
print(imdb[yıl_2000den_buyuk & Oylayan_Kişi_500000])
Film_Adı Yıl Puan Oylayan_Kişi
4 The Dark Knight 2008 8.9 1045186
7 The Lord of the Rings: The Return of the King 2003 8.8 758388
10 The Lord of the Rings: The Fellowship of the R... 2001 8.8 784999
14 Inception 2010 8.7 844938
18 The Lord of the Rings: The Two Towers 2002 8.7 680983
49 The Departed 2006 8.4 540726
56 The Dark Knight Rises 2012 8.4 672751
105 Batman Begins 2005 8.3 604923
107 Inglourious Basterds 2009 8.2 505702
162 V for Vendetta 2005 8.1 507750
165 The Avengers 2012 8.1 568037
216 Pirates of the Caribbean: The Curse of the Bla... 2003 8.0 519625
yıl_2000den_buyuk = imdb["Yıl"] > 2000
Oylayan_Kişi_500000 = imdb["Oylayan_Kişi"] > 500000
print(imdb[yıl_2000den_buyuk | Oylayan_Kişi_500000])
Film_Adı Yıl Puan Oylayan_Kişi
0 The Shawshank Redemption 1994 9.2 1071904
1 The Godfather 1972 9.2 751381
3 Pulp Fiction 1994 8.9 830504
4 The Dark Knight 2008 8.9 1045186
6 Schindler's List 1993 8.9 545703
... ... ... ... ...
231 Shutter Island 2010 8.0 436151
233 Incendies 2010 8.0 36751
236 3 Idiots 2009 8.0 83178
237 The Artist 2011 8.0 132672
242 Mystic River 2003 7.9 256159

81 rows × 4 columns

Filtreleme esnasında String Metotlarını kullanmak için str kelimesinden yararlanıyoruz. Diyelim ki içerisinde star wars kelime grubu bulunan tüm filmleri filtrelemek istiyoruz. Python küçük harf ve büyük harfe duyarlı olduğu için, star wars yazıp aradığımız zaman Star Wars, STAR WARS ,...vb hiçbir film, filtreye takılmayacak ve yanlış sonuç almış olacağız. Bu durumun önüne geçmek için, öncelikle tüm film isimlerini küçük harfe ya da büyük harfe çevirerek arama/filtreleme yapmamız gerekecektir. Aşama aşama gidelim. Tüm film isimlerini küçük harfe çevirelim. Film isimleri indeks olarak ayarlandığı için film isimleri sütununu temsilen, index kelimesini kullanmalıyız.

imdb = pd.read_excel("Veri_Setleri/imdb.xlsx", index_col="Film_Adı")
kucuk_harf = imdb.index.str.lower()
print(kucuk_harf)
Index(['the shawshank redemption ', 'the godfather ',
       'the godfather: part ii ', 'pulp fiction', 'the dark knight ',
       '12 angry men ', 'schindler's list ',
       'the lord of the rings: the return of the king ', 'fight club ',
       'star wars: episode v - the empire strikes back ',
       ...
       'the artist ', 'nausicaä of the valley of the wind ',
       'beauty and the beast ', 'three colors: red ', 'bringing up baby ',
       'mystic river ', 'in the heat of the night ', 'arsenic and old lace ',
       'before sunrise ', 'papillon '],
      dtype='object', name='Film_Adı', length=247)

Gördüğünüz gibi film isimleri tamamen küçük harfe dönüşmüş oldu. String metotlarından biri olan contains ile metin içerisinde içeren kelime ya da kelimeleri aratabiliyoruz. Şimdi Sıra geldi filtreleme işlemine.

star_wars_icerir = kucuk_harf.str.contains("star wars")
print(imdb[star_wars_icerir])
Film_Adı Yıl Puan Oylayan_Kişi
Star Wars: Episode V - The Empire Strikes Back 1980 8,8 519895
Star Wars 1977 8,7 585132
Star Wars: Episode VI - Return of the Jedi 1983 8,3 410111

Biraz karışık gelse de tüm kodları irleştirip aynı sonucu elde edebiliriz.

star_wars_filtrele = imdb.index.str.lower().str.contains("star wars")
print(imdb[star_wars_filtrele])
Film_Adı Yıl Puan Oylayan_Kişi
Star Wars: Episode V - The Empire Strikes Back 1980 8,8 519895
Star Wars 1977 8,7 585132
Star Wars: Episode VI - Return of the Jedi 1983 8,3 410111

← Önceki Bölüm | Sonraki Bölüm →