Python Pandas ile Temel İşlemler
Bölüm 4 – Filtreleme
Pandas yazı serimizin dördüncüsüyle devam ediyoruz. Bu yazımızda veri setimize bazı kriterlere göre nasıl filtre uygularız ona bakacağız. Filtrelemeden önce veri setimize yeni bir sütun ilave edip burada filmleri uzunuğuna göre kategorilendireceğiz. Film listemizi yükleyelim.
Veriyi Yükleme
import pandas as pd filmListesi = pd.read_csv("https://raw.githubusercontent.com/erkansirin78/datasets/master/imdb_1000.csv")
Yeni Sütun Oluşturma
Filmlerden 120 dakikadan daha uzun olanlara çok uzun, 80-120 dakika arasında olanlara normal 80 dakikadan daha kısa olanlara da kısa diyelim. Bunun için aşağıdaki kodlar yeterli olacaktır.
filmUzunlukKategori = [] for i in filmListesi.duration: if i <= 80: filmUzunlukKategori.append('Cok Kisa') elif i > 80 and i <=120: filmUzunlukKategori.append('Normal') else: filmUzunlukKategori.append('Cok Uzun')
Python listemizde biriken 979 kategoriyi bir sütun halinde filmListesi tablomuza ekleyelim.
filmListesi['uzunlukKategori'] = filmUzunlukKategori filmListesi.head()
star_rating | title | content_rating | genre | duration | actors_list | uzunlukKategori | |
---|---|---|---|---|---|---|---|
0 | 9.3 | The Shawshank Redemption | R | Crime | 142 | [u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt… | Cok Uzun |
1 | 9.2 | The Godfather | R | Crime | 175 | [u’Marlon Brando’, u’Al Pacino’, u’James Caan’] | Cok Uzun |
2 | 9.1 | The Godfather: Part II | R | Crime | 200 | [u’Al Pacino’, u’Robert De Niro’, u’Robert Duv… | Cok Uzun |
3 | 9.0 | The Dark Knight | PG-13 | Action | 152 | [u’Christian Bale’, u’Heath Ledger’, u’Aaron E… | Cok Uzun |
4 | 8.9 | Pulp Fiction | R | Crime | 154 | [u’John Travolta’, u’Uma Thurman’, u’Samuel L…. | Cok Uzun |
Görüldüğü gibi en sonda yeni sütunumuz yer aldı. Dikkat ettiysek duration bilgisi ile kategori bilgisi uyum gösteriyor. Buradaki beş kayıt hep 120 dakikadan fazla olduğu için kategori Cok uzun olmuş. Bir kaç filtreleme yapalım. Cok uzun filmleri filtrele:
Filtreleme (Süzme)
filmListesi[filmListesi.uzunlukKategori == 'Cok Uzun']
Türü Action olanları filtrele:
filmListesi[filmListesi.genre == 'Action']
Normal uzunluktaki aksiyon filmlerini listele:
filmListesi[(filmListesi.genre == 'Action') & (filmListesi.uzunlukKategori == 'Normal')]
star_rating | title | content_rating | genre | duration | actors_list | uzunlukKategori | |
---|---|---|---|---|---|---|---|
37 | 8.6 | Raiders of the Lost Ark | PG | Action | 115 | [u’Harrison Ford’, u’Karen Allen’, u’Paul Free… | Normal |
96 | 8.4 | Yojimbo | UNRATED | Action | 110 | [u’Toshir\xf4 Mifune’, u’Eijir\xf4 T\xf4no’, u… | Normal |
123 | 8.3 | The General | UNRATED | Action | 107 | [u’Buster Keaton’, u’Marion Mack’, u’Glen Cave… | Normal |
198 | 8.1 | Kill Bill: Vol. 1 | R | Action | 111 | [u’Uma Thurman’, u’David Carradine’, u’Daryl H… | Normal |
235 | 8.1 | Yip Man | R | Action | 106 | [u’Donnie Yen’, u’Simon Yam’, u’Siu-Wong Fan’] | Normal |
239 | 8.1 | Elite Squad: The Enemy Within | UNRATED | Action | 115 | [u’Wagner Moura’, u’Irandhir Santos’, u’Andr\x… | Normal |
240 | 8.1 | The Bourne Ultimatum | PG-13 | Action | 115 | [u’Matt Damon’, u’\xc9dgar Ram\xedrez’, u’Joan… | Normal |
261 | 8.1 | Elite Squad | R | Action | 115 | [u’Wagner Moura’, u’Andr\xe9 Ramiro’, u’Caio J… | Normal |
276 | 8.1 | A Fistful of Dollars | R | Action | 99 | [u’Clint Eastwood’, u’Gian Maria Volont\xe9′, … | Normal |
281 | 8.1 | The Terminator | R | Action | 107 | [u’Arnold Schwarzenegger’, u’Linda Hamilton’, … | Normal |
327 | 8.0 | The Adventures of Robin Hood | PG | Action | 102 | [u’Errol Flynn’, u’Olivia de Havilland’, u’Bas… | Normal |
349 | 8.0 | District 9 | R | Action | 112 | [u’Sharlto Copley’, u’David James’, u’Jason Co… | Normal |
366 | 8.0 | Serenity | PG-13 | Action | 119 | [u’Nathan Fillion’, u’Gina Torres’, u’Chiwetel… | Normal |
391 | 8.0 | Edge of Tomorrow | PG-13 | Action | 113 | [u’Tom Cruise’, u’Emily Blunt’, u’Bill Paxton’] | Normal |
401 | 7.9 | The Killer | R | Action | 111 | [u’Yun-Fat Chow’, u’Danny Lee’, u’Sally Yeh’] | Normal |
403 | 7.9 | Ying xiong | PG-13 | Action | 99 | [u’Jet Li’, u’Tony Chiu Wai Leung’, u’Maggie C… | Normal |
411 | 7.9 | The Bourne Identity | PG-13 | Action | 119 | [u’Franka Potente’, u’Matt Damon’, u’Chris Coo… | Normal |
437 | 7.9 | Crouching Tiger, Hidden Dragon | PG-13 | Action | 120 | [u’Yun-Fat Chow’, u’Michelle Yeoh’, u’Ziyi Zha… | Normal |
Yazıda çok yer kaplamasın diye ben sonucun hepsini buraya koymadım. Aslında daha uzun. Aynı sonucu aşağıdaki yöntemle de alabiliriz.
filmListesi[filmListesi.genre == 'Action'][filmListesi.uzunlukKategori == 'Normal']
Bir de ya da koşuluyla örnek yapalım. Ratingi 9’dan büyük ya da Adventure türündeki filmleri listeleyelim:
filmListesi[(filmListesi.genre == 'Adventure') | (filmListesi.star_rating >= 9.0)]
star_rating | title | content_rating | genre | duration | actors_list | uzunlukKategori | |
---|---|---|---|---|---|---|---|
0 | 9.3 | The Shawshank Redemption | R | Crime | 142 | [u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt… | Cok Uzun |
1 | 9.2 | The Godfather | R | Crime | 175 | [u’Marlon Brando’, u’Al Pacino’, u’James Caan’] | Cok Uzun |
2 | 9.1 | The Godfather: Part II | R | Crime | 200 | [u’Al Pacino’, u’Robert De Niro’, u’Robert Duv… | Cok Uzun |
3 | 9.0 | The Dark Knight | PG-13 | Action | 152 | [u’Christian Bale’, u’Heath Ledger’, u’Aaron E… | Cok Uzun |
7 | 8.9 | The Lord of the Rings: The Return of the King | PG-13 | Adventure | 201 | [u’Elijah Wood’, u’Viggo Mortensen’, u’Ian McK… | Cok Uzun |
10 | 8.8 | The Lord of the Rings: The Fellowship of the Ring | PG-13 | Adventure | 178 | [u’Elijah Wood’, u’Ian McKellen’, u’Orlando Bl… | Cok Uzun |
14 | 8.8 | The Lord of the Rings: The Two Towers | PG-13 | Adventure | 179 | [u’Elijah Wood’, u’Ian McKellen’, u’Viggo Mort… | Cok Uzun |
15 | 8.7 | Interstellar | PG-13 | Adventure | 169 | [u’Matthew McConaughey’, u’Anne Hathaway’, u’J… | Cok Uzun |
54 | 8.5 | Back to the Future | PG | Adventure | 116 | [u’Michael J. Fox’, u’Christopher Lloyd’, u’Le… | Normal |
68 | 8.4 | Das Boot | R | Adventure | 149 | [u’J\xfcrgen Prochnow’, u’Herbert Gr\xf6nemeye… | Cok Uzun |
71 | 8.4 | North by Northwest | APPROVED | Adventure | 136 | [u’Cary Grant’, u’Eva Marie Saint’, u’James Ma… | Cok Uzun |
85 | 8.4 | Lawrence of Arabia | PG | Adventure | 216 | [u”Peter O’Toole”, u’Alec Guinness’, u’Anthony… | Cok Uzun |
Gruplama, Sıralama, Ortalama Alma, Aggregation
Şimdi film türlerine göre rating ortalamaları nedir bir bakalım. Yani hangi film türü en yüksek puanı alıyor? En yüksek ortalamadan aşağı (descending) sıralayalım.
filmListesi.groupby('genre').star_rating.mean().sort_values(ascending=False) genre Western 8.255556 Film-Noir 8.033333 History 8.000000 Mystery 7.975000 Adventure 7.933333 Sci-Fi 7.920000 Crime 7.916935 Animation 7.914516 Drama 7.902518 Action 7.884559 Biography 7.862338 Family 7.850000 Comedy 7.822436 Horror 7.806897 Fantasy 7.700000 Thriller 7.680000 Name: star_rating, dtype: float64
Yukarıda iki yeni metod kullandık. Birincisi groupby() ikincisi sort_values(). İlki film türlerine göre ortalamaları filtreledi, ikincisi ortalamalı büyükten küçüğe sıraladı. Büyükten küçüğe sıralama, ascending parametresinin False değeri almasına bağlıdır.
Yukarıdaki sonuçları bir de çizdirelim.
%matplotlib inline filmListesi.groupby('genre').star_rating.mean().sort_values(ascending=False).plot(kind='bar')
Biraz daha karmaşık bir iş yapalım. Yine genre gruplaması olsun. Daha sonra her bir genre ortalama, min, max ve count nedir bakalım. Sonuçları puan ortalaması yüksekten düşüğe sıralayalım.
filmListesi.groupby('genre').star_rating.agg(['mean','max','min','count']).sort_values('mean',ascending=False)
mean | max | min | count | |
---|---|---|---|---|
genre | ||||
Western | 8.255556 | 8.9 | 7.6 | 9 |
Film-Noir | 8.033333 | 8.3 | 7.7 | 3 |
History | 8.000000 | 8.0 | 8.0 | 1 |
Mystery | 7.975000 | 8.6 | 7.4 | 16 |
Adventure | 7.933333 | 8.9 | 7.4 | 75 |
Sci-Fi | 7.920000 | 8.2 | 7.7 | 5 |
Crime | 7.916935 | 9.3 | 7.4 | 124 |
Animation | 7.914516 | 8.6 | 7.4 | 62 |
Drama | 7.902518 | 8.9 | 7.4 | 278 |
Action | 7.884559 | 9.0 | 7.4 | 136 |
Biography | 7.862338 | 8.9 | 7.4 | 77 |
Family | 7.850000 | 7.9 | 7.8 | 2 |
Comedy | 7.822436 | 8.6 | 7.4 | 156 |
Horror | 7.806897 | 8.6 | 7.4 | 29 |
Fantasy | 7.700000 | 7.7 | 7.7 | 1 |
Thriller | 7.680000 | 8.0 | 7.5 | 5 |
En yüksek ortalamaya sahip Western sadece 9 taneymiş. Dolayısıyla ben bu yüksek ortalamayı düşük sayılı gözlem olduğundan sağlıklı bulmuyorum 🙂
Bu yazımı da burada kesiyorum. Pandas yazılarına devam. Veriyle kalın…
Mehaba. yukarıda türkçe sütun isimlerini değiştirmeden önce sütun sayısını 2’ye düşürdüğünüz için uyarı veriyor. Dolayısıyla sütun sayısını düşürmeden isim değişikliği yaptım. Bilginize. paylaşımlarınız için tşk ederim.
Merhaba. Haklısınız. Düzeltme yaptım. İki sütun için dataframe’i “ufo_two_cols” ismiyle tuttuk. Çok teşekkürler.