Ana içeriğe atla

Veri Bilimi Okulu

Python Pandas ile Temel İşlemler
Python Pandas ile Temel İşlemler
pandas_basic_df_ops_kapak

Bölüm 1 – Dosya Okuma & Sütun İsimlendirme

Pandas; veri analizi ve veri ön işlemeyi kolaylaştıran  açık kaynak kodlu bir kütüphanedir. Dil olarak Python kullanır. Pandas dağıtık işlemeye uygun değildir. Bu sebeple işleyeceğiniz verinin büyüklüğü makinenin kapasitesiyle sınırlıdır, özellikle de ana belleğin. Ben büyük veri setleri üzerinde işlem yaptığım için Pandas’ı çok fazla kullanamıyorum ancak bazı ufak tefek işleri yapıyorum yine de. Bu yazımda Pandas ile temel olarak neler yapılabilir, daha doğrusu ben çoğunlukla neler yapıyorum sizlerle paylaşacağım.

import pandas as pd

Pandas ile csv Dosyası Okumak

csv dosyamızı okuyalım ve bir değişkene atayalım. Dosyayı buradan indirebilirsiniz.

ufo = pd.read_csv('https://raw.githubusercontent.com/erkansirin78/datasets/master/uforeports.csv')

head() metodu ile veri setimizin ilk beş kaydına bir bakalım.

ufo.head()
  City Colors Reported Shape Reported State Time
0 Ithaca NaN TRIANGLE NY 6/1/1930 22:00
1 Willingboro NaN OTHER NJ 6/30/1930 20:00
2 Holyoke NaN OVAL CO 2/15/1931 14:00
3 Abilene NaN DISK KS 6/1/1931 13:00
4 New York Worlds Fair NaN LIGHT NY 4/18/1933 19:00

Veri setimiz kaç satır, kaç sütun yani boyutları nedir shape niteliğinden öğreniyoruz.

ufo.shape
(18241, 5)

Pandas ile csv Dosyasından Belirli Sütunları Okumak

Veri setindeki bazı niteliklerle işimiz yok ise en başta okurken sadece işimize yarayanları okuyabiliriz. Bunun için read_csv() metoduna sadece bir argüman eklememiz yeterli. Bu argüman bir liste ve bu listede seçilmek istenen sütun isimleri bulunur.

ufo_two_cols = pd.read_csv('https://raw.githubusercontent.com/erkansirin78/datasets/master/uforeports.csv', usecols=['State','Time'])

Pandas ile Sütun İsimlerini Değiştirmek

Haydi sütun isimlerini Türkçe yapalım. Öncelikle beş tane sütun isminin Türkçe karşılıklarını bir Python listesine atacağız. Sonra da bu listedeki isimleri veri setimizin sütun isimleriyle değiştireceğiz.

turkce_sutun_isimleri = ['Sehir','Renk','Sekil','Eyalet','Zaman']
ufo.columns = turkce_sutun_isimleri

Sonucu head() metoduyla hep beraber görelim.

ufo.head()
  Sehir Renk Sekil Eyalet Zaman
0 Ithaca NaN TRIANGLE NY 6/1/1930 22:00
1 Willingboro NaN OTHER NJ 6/30/1930 20:00
2 Holyoke NaN OVAL CO 2/15/1931 14:00
3 Abilene NaN DISK KS 6/1/1931 13:00
4 New York Worlds Fair NaN LIGHT NY 4/18/1933 19:00

Pandas ile Sütun Seçmek

Seçme işlemini iki yöntemle yapıyoruz. Mesela Sehir sütununu seçelim:

ufo['Sehir'] veya
ufo.Sehir
0                      Ithaca
1                 Willingboro
2                     Holyoke
3                     Abilene
...
18237             Spirit Lake
18238             Eagle River
18239             Eagle River
18240                    Ybor
Name: Sehir, dtype: object

Sonuç yukarıda görüldüğü gibidir. Aslında daha uzun bir liste görülür ancak ben makalemi kısa tutmak adına daha azını buraya aldım. İki yöntemin kullanımı şu şekilde farklılaşabilir. Eğer sütun isminiz boşluk içeriyorsa mutlaka köşeli parantez kullanmalısınız. Nitelik kullanımı ise ancak boşluksuz sütun isimlerinde kullanılabilir.

Pandas ile Sütun Birleştirmek

Şehir ve Eyalet sütunlarını tek sütun altında birleştirmek isteyelim ve bu sütunları virgülle ayıralım.

ufo['SehirEyalet'] = ufo.Eyalet + ', ' + ufo.Sehir
  Sehir Renk Sekil Eyalet Zaman SehirEyalet
0 Ithaca NaN TRIANGLE NY 6/1/1930 22:00 NY, Ithaca
1 Willingboro NaN OTHER NJ 6/30/1930 20:00 NJ, Willingboro
2 Holyoke NaN OVAL CO 2/15/1931 14:00 CO, Holyoke
3 Abilene NaN DISK KS 6/1/1931 13:00 KS, Abilene
4 New York Worlds Fair NaN LIGHT NY 4/18/1933 19:00 NY, New York Worlds Fair

yukarıdaki tabloda görüldüğü gibi SehirEyalet adında yeni bir sütun oluştu.

Pandas ile Veri Setindeki Veri Tiplerini  Yazdırmak

Veri setinde hangi nitelikler var ve bunların türü nedir görmek için dtypes niteliğini kullanıyoruz. Sonuç bir nevi şema gibi aslında. Bundan önce veri setimizde farklı bir nitelik türü olması açısından id sütunu ekleyelim. id sütununda satır sayısı kadar bir bir artan rakamlar olacak.

ufo['id'] = range(0,18241)

range(0,18241) fonksiyonu 0’dan 18241’e kadar bir liste oluşturdu ve bu listeyi alıp sütun halinde id niteliğinin altına ufo[‘id’] komutuyla koyduk. Şimdi veri türlerini yazdırabiliriz.

ufo.dtypes
Sehir          object
Renk           object
Sekil          object
Eyalet         object
Zaman          object
SehirEyalet    object
id              int64
dtype: object

Pandas ile Sütunları Yeniden Adlandırmak

Yukarıda sütun isimlerini tamamen değiştirmiş ve Türkçe yapmıştık. Şimdi ise sütun isimlerini değiştireceğiz. Bunun için rename() metodunu kullanacağız. Aşağıda Sehir sütun ismini değiştirerek Sehir_Yeni yapacak kodu bulacaksınız.

ufo.rename(columns ={'Sehir':'Sehir_Yeni'},inplace=True)

Kontrol edelim değişmiş mi?

ufo.columns
Index([u'Sehir_Yeni', u'Renk', u'Sekil', u'Eyalet', u'Zaman', u'SehirEyalet',u'id'], dtype='object')

Evet değişmiş. Şimdilik burada kesiyorum. Aşağıdan 2. sayfaya tıklayarak yeni bölüme bakabilirsiniz. Veriyle kalın…

Bölüm 2 – Sütun Ekleme/Kaldırma

Pandas ile temel işlemlere devam ediyoruz. Birinci bölümde ufo verimizi yüklemiştik.

Pandas ile Sütun Eklemek ve Kaldırmak

SQL’den hatırladığımız drop sözcüğü burada da iş başında. Bir sütunu tablodan (dataframe) kaldırmak istiyorsak drop() metodunu kullanıyoruz. Bir kaç argüman ile seçeneklerimizi arttırabiliyoruz. Sütun kaldırmadan önce yeni bir sütun ekleyelim ve onu kaldıralım. Ekleyeceğim yeni sütun 10.000 ile 200.000 arasında rakamlardan oluşacak ve bu sütundaki rakamları ufonun görüldüğü şehrin nüfusu kabul edeceğim.

from random import randint

Nüfus için rastgele rakamlar elde etmek için random randint kütüphanesini kullanıyoruz. Aşağıda bir for döngüsüyle tablomuzun satır sayısı olan 18.241 adet rastgele rakam üretip bu rakamları rastgele_sayilar adında bir Python listesine ekliyoruz.

rastgele_sayilar = []
for i in range(0,18241):
    rastgele_sayilar.append(randint(10000,200000))

Bakalım listemizin uzunluğu tablo satır sayısıyla aynı mı?

len(rastgele_sayilar)
18241

evet aynıymış. Şimdi yeni bir sütun oluşturarak rastgele_sayilar listemizi bu sütuna atayalım.

ufo['nufus'] = rastgele_sayilar

head() metoduyla tablomuzun yeni halini görelim.

ufo.head()
  City Colors Reported Shape Reported State Time nufus
0 Ithaca NaN TRIANGLE NY 6/1/1930 22:00 81348
1 Willingboro NaN OTHER NJ 6/30/1930 20:00 50670
2 Holyoke NaN OVAL CO 2/15/1931 14:00 84373
3 Abilene NaN DISK KS 6/1/1931 13:00 83502
4 New York Worlds Fair NaN LIGHT NY 4/18/1933 19:00 58124

Gördüğümüz gibi nufus adında yeni sütun tabloya eklendi. Şimdi eklediğimiz bu sütunu kaldıralım.

ufo.drop('nufus',axis=1, inplace=True)

Yukarıdaki kodda axis=1 sütun demektir. inplace=True ise temelli kaldır, kaldıyormuş gibi yapma 🙂 demektir.

Pandas ile Satır Silmek

drop() metodu sütun kaldırdığı gibi satır da kaldırır. Metodumuz aynı, sadece axis argümanı 0 (sıfır) değerini alır. Hemen ilk iki satırı (0 ve 1 indekse sahip satırlar) kaldıralım. Satırı seçmek için Pandas’ın kendi atadığı en soldaki satır numarası değerini kullanacağız.

ufo.drop([0,1], axis=0, inplace=True)

Şimdi head() metoduyla tekrar bir bakalım gerçekten ilk iki satır silinmiş mi?

ufo.head()
  City Colors Reported Shape Reported State Time
2 Holyoke NaN OVAL CO 2/15/1931 14:00
3 Abilene NaN DISK KS 6/1/1931 13:00
4 New York Worlds Fair NaN LIGHT NY 4/18/1933 19:00
5 Valley City NaN DISK ND 9/15/1934 15:30
6 Crater Lake NaN CIRCLE CA 6/15/1935 0:00

Görüldüğü gibi 0 ve 1’inci satırlar silinmiş. Şimdi üçüncü bölüme geçebiliriz.

Bölüm – 3 Sıralama-Sorting

Python Pandas ile temel işlemler yazı dizimize devam ediyoruz. Bu yazımızda meşhur İnternet movie database (imdb) sitesinden alına bir veri setini kullanacağız. Hemen veri setimizi indirip bir değişkene atayalım, head() metoduyla EDA yapalım. Bu EDA nedir? diye sormayın. Keşfedici veri analizi (exploratory data analysis); veri nedir, ne değildir şöyle bir fikir edineyim amacıyla incelemek demek. Biz bunu böyle basit tek tabloluk veri setlerinde head() metoduyla yapabiliyoruz. Kardeş bana ilk beş satırını bir göster bakalım sende ne var ne yok.

filmListesi = pd.read_csv("https://raw.githubusercontent.com/erkansirin78/datasets/master/imdb_1000.csv")
filmListesi.head()
  star_rating title content_rating genre duration actors_list
0 9.3 The Shawshank Redemption R Crime 142 [u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…
1 9.2 The Godfather R Crime 175 [u’Marlon Brando’, u’Al Pacino’, u’James Caan’]
2 9.1 The Godfather: Part II R Crime 200 [u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…
3 9.0 The Dark Knight PG-13 Action 152 [u’Christian Bale’, u’Heath Ledger’, u’Aaron E…
4 8.9 Pulp Fiction R Crime 154 [u’John Travolta’, u’Uma Thurman’, u’Samuel L….

Pandas ile Sıralama İşlemi

Bir çok zaman elimizdeki veriyi küçükten büyüğe veya alfabetik olarak sıralamak isteriz. Burada bunu nasıl yapacağımızı göreceğiz. Kullanacağımız metod sort_values() olacak. Burada şunu hatırlatmak istiyorum. Pandas’da temel olarak iki veri yapısı var birincisi tablonun hepsini oluşturan frame, tablonun bir sütununu oluşturan series. Burada kullanacağımız sort_values() metodu series sınıfına ait bir metod. Hemen isterseniz Python’un type() metoduyla bunu görelim:

type(filmListesi)
pandas.core.frame.DataFrame
type(filmListesi.title)
pandas.core.series.Series

Yeşil olanlar veri tipini gösteriyor. Neyse detaya inmeden devam edelim. Şimdi title sütununu sıralayalım:

filmListesi.title.sort_values()
542                   (500) Days of Summer
5                             12 Angry Men
201                       12 Years a Slave
698                              127 Hours
110                  2001: A Space Odyssey
910                                   2046
596                               21 Grams
624                              25th Hour
708                       28 Days Later...
60                                3 Idiots
225                                 3-Iron
570                                    300
555                           3:10 to Yuma
427           4 Months, 3 Weeks and 2 Days
824                                     42
597                                  50/50
203                                  8 1/2
170                       A Beautiful Mind
...
96                                 Yojimbo
280                     Young Frankenstein
535                                  Zelig
955                       Zero Dark Thirty
677                                 Zodiac
615                             Zombieland
526                                   Zulu
864                                  [Rec]
Name: title, dtype: object

Görüldüğü gibi A’dan Z’ye sıraladı. Tersinden sıralamak istiyorsak sort_values(ascending=False) metoda ascending=False şeklinde sadece bir argüman eklememiz yeterli olur.

Aynı metod ile tüm tabloyu (dataframe) bir sütunu baz alarak sıralayabiliriz.

filmListesi.sort_values('title')
  star_rating title content_rating genre duration actors_list
542 7.8 (500) Days of Summer PG-13 Comedy 95 [u’Zooey Deschanel’, u’Joseph Gordon-Levitt’, …
5 8.9 12 Angry Men NOT RATED Drama 96 [u’Henry Fonda’, u’Lee J. Cobb’, u’Martin Bals…
201 8.1 12 Years a Slave R Biography 134 [u’Chiwetel Ejiofor’, u’Michael Kenneth Willia…
698 7.6 127 Hours R Adventure 94 [u’James Franco’, u’Amber Tamblyn’, u’Kate Mara’]
110 8.3 2001: A Space Odyssey G Mystery 160 [u’Keir Dullea’, u’Gary Lockwood’, u’William S…
910 7.5 2046 R Drama 129 [u’Tony Chiu Wai Leung’, u’Ziyi Zhang’, u’Faye…
596 7.7 21 Grams R Crime 124 [u’Sean Penn’, u’Benicio Del Toro’, u’Naomi Wa…

….

  star_rating title content_rating genre duration actors_list
280 8.1 Young Frankenstein PG Comedy 106 [u’Gene Wilder’, u’Madeline Kahn’, u’Marty Fel…
535 7.8 Zelig PG Comedy 79 [u’Woody Allen’, u’Mia Farrow’, u’Patrick Horg…
955 7.4 Zero Dark Thirty R Drama 157 [u’Jessica Chastain’, u’Joel Edgerton’, u’Chri…
677 7.7 Zodiac R Crime 157 [u’Jake Gyllenhaal’, u’Robert Downey Jr.’, u’M…
615 7.7 Zombieland R Comedy 88 [u’Jesse Eisenberg’, u’Emma Stone’, u’Woody Ha…
526 7.8 Zulu UNRATED Drama 138 [u’Stanley Baker’, u’Jack Hawkins’, u’Ulla Jac…
864 7.5 [Rec] R Horror 78 [u’Manuela Velasco’, u’Ferran Terraza’, u’Jorg…

Gördüğümüz gibi tabloyu komple title sütununa göre sıraladık.

Pandas ile Birden Fazla Niteliği Aynı Anda Sıralama

Yukarıda sadece tek bir niteliğe göre sıralama yaptık. Şimdi aynı anda birden fazla niteliğe göre tabloyu nasıl sıralarız ona bakalım. Bunun için aynı metodu sort_values() kullanıyor olacağız Ancak içine koyacağımız argüman farklı olacak. Şimdi önce tür (genre) sonra film adı (title) olacak şekilde sıralayalım.

filmListesi.sort_values(['genre','title'])
  star_rating title content_rating genre duration actors_list
570 7.8 300 R Action 117 [u’Gerard Butler’, u’Lena Headey’, u’David Wen…
276 8.1 A Fistful of Dollars R Action 99 [u’Clint Eastwood’, u’Gian Maria Volont\xe9′, …
75 8.4 Aliens R Action 137 [u’Sigourney Weaver’, u’Michael Biehn’, u’Carr…
529 7.8 Apocalypto R Action 139 [u’Gerardo Taracena’, u’Raoul Trujillo’, u’Dal…
433 7.9 Avatar PG-13 Action 162 [u’Sam Worthington’, u’Zoe Saldana’, u’Sigourn…
801 7.6 Batman PG-13 Action 126 [u’Michael Keaton’, u’Jack Nicholson’, u’Kim B…
113 8.3 Batman Begins PG-13 Action 140 [u’Christian Bale’, u’Michael Caine’, u’Ken Wa…
573 7.8 Battle Royale NOT RATED Action 114 [u’Tatsuya Fujiwara’, u’Aki Maeda’, u’Tar\xf4 …
82 8.4 Braveheart R Action 177 [u’Mel Gibson’, u’Sophie Marceau’, u’Patrick M…
908 7.5 Bullitt PG Action 114 [u’Steve McQueen’, u’Jacqueline Bisset’, u’Rob…
517 7.8 Captain America: The Winter Soldier PG-13 Action 136 [u’Chris Evans’, u’Samuel L. Jackson’, u’Scarl…
380 8.0 Casino Royale PG-13 Action 144 [u’Daniel Craig’, u’Eva Green’, u’Judi Dench’]
437 7.9 Crouching Tiger, Hidden Dragon PG-13 Action 120 [u’Yun-Fat Chow’, u’Michelle Yeoh’, u’Ziyi Zha…
623 7.7 Dawn of the Planet of the Apes PG-13 Action 130 [u’Gary Oldman’, u’Keri Russell’, u’Andy Serkis’]
138 8.3 Die Hard R Action 131 [u’Bruce Willis’, u’Alan Rickman’, u’Bonnie Be…
778 7.6 Die Hard: With a Vengeance R Action 131 [u’Bruce Willis’, u’Jeremy Irons’, u’Samuel L….
515 7.8 Dirty Harry R Action 102 [u’Clint Eastwood’, u’Andrew Robinson’, u’Harr…
349 8.0 District 9 R Action 112 [u’Sharlto Copley’, u’David James’, u’Jason Co…
391 8.0 Edge of Tomorrow PG-13 Action 113 [u’Tom Cruise’, u’Emily Blunt’, u’Bill Paxton’]
261 8.1 Elite Squad R Action 115 [u’Wagner Moura’, u’Andr\xe9 Ramiro’, u’Caio J…
239 8.1 Elite Squad: The Enemy Within UNRATED Action 115 [u’Wagner Moura’, u’Irandhir Santos’, u’Andr\x…
610 7.7 Enter the Dragon R Action 102 [u’Bruce Lee’, u’John Saxon’, u’Jim Kelly’]
815 7.6 Equilibrium R Action 107 [u’Christian Bale’, u’Sean Bean’, u’Emily Wats…
753 7.6 Escape from Alcatraz PG Action 112 [u’Clint Eastwood’, u’Patrick McGoohan’, u’Rob…
653 7.7 Fearless PG-13 Action 104 [u’Jet Li’, u’Li Sun’, u’Yong Dong’]
685 7.7 First Blood R Action 93 [u’Sylvester Stallone’, u’Brian Dennehy’, u’Ri…
619 7.7 Forbidden Planet PASSED Action 98 [u’Walter Pidgeon’, u’Anne Francis’, u’Leslie …
896 7.5 From Russia with Love APPROVED Action 115 [u’Sean Connery’, u’Robert Shaw’, u’Lotte Lenya’]
301 8.0 Furious 7 PG-13 Action 137 [u’Vin Diesel’, u’Paul Walker’, u’Dwayne Johns…
683 7.7 Fury R Action 134 [u’Brad Pitt’, u’Shia LaBeouf’, u’Logan Lerman’]
38 8.6 Rear Window APPROVED Mystery 112 [u’James Stewart’, u’Grace Kelly’, u’Wendell C…
149 8.2 Rebecca NOT RATED Mystery 130 [u’Laurence Olivier’, u’Joan Fontaine’, u’Geor…
244 8.1 Shutter Island R Mystery 138 [u’Leonardo DiCaprio’, u’Emily Mortimer’, u’Ma…
249 8.1 Sleuth PG Mystery 138 [u’Laurence Olivier’, u’Michael Caine’, u’Alec…
894 7.5 Source Code PG-13 Mystery 93 [u’Jake Gyllenhaal’, u’Michelle Monaghan’, u’V…
467 7.9 The 39 Steps UNRATED Mystery 86 [u’Robert Donat’, u’Madeleine Carroll’, u’Luci…
292 8.1 The Manchurian Candidate APPROVED Mystery 126 [u’Frank Sinatra’, u’Laurence Harvey’, u’Janet…
863 7.5 Three Days of the Condor R Mystery 117 [u’Robert Redford’, u’Faye Dunaway’, u’Cliff R…
866 7.5 To Catch a Thief APPROVED Mystery 106 [u’Cary Grant’, u’Grace Kelly’, u’Jessie Royce…
264 8.1 Twelve Monkeys R Mystery 129 [u’Bruce Willis’, u’Madeleine Stowe’, u’Brad P…
76 8.4 Vertigo APPROVED Mystery 128 [u’James Stewart’, u’Kim Novak’, u’Barbara Bel…
145 8.2 Blade Runner R Sci-Fi 117 [u’Harrison Ford’, u’Rutger Hauer’, u’Sean You…
321 8.0 Brazil R Sci-Fi 132 [u’Jonathan Pryce’, u’Kim Greist’, u’Robert De…
408 7.9 Gravity PG-13 Sci-Fi 91 [u’Sandra Bullock’, u’George Clooney’, u’Ed Ha…
637 7.7 The Butterfly Effect R Sci-Fi 113 [u’Ashton Kutcher’, u’Amy Smart’, u’Melora Wal…
484 7.8 The Day the Earth Stood Still APPROVED Sci-Fi 92 [u’Michael Rennie’, u’Patricia Neal’, u’Hugh M…
902 7.5 Frenzy R Thriller 116 [u’Jon Finch’, u’Barry Foster’, u’Alec McCowen’]
728 7.6 La piel que habito R Thriller 120 [u’Antonio Banderas’, u’Elena Anaya’, u’Jan Co…
496 7.8 Misery R Thriller 107 [u’James Caan’, u’Kathy Bates’, u’Richard Farn…
350 8.0 Shadow of a Doubt APPROVED Thriller 108 [u’Teresa Wright’, u’Joseph Cotten’, u’Macdona…
848 7.5 The Man Who Knew Too Much PG Thriller 120 [u’James Stewart’, u’Doris Day’, u’Brenda de B…
59 8.5 Django Unchained R Western 165 [u’Jamie Foxx’, u’Christoph Waltz’, u’Leonardo…
107 8.3 For a Few Dollars More APPROVED Western 132 [u’Clint Eastwood’, u’Lee Van Cleef’, u’Gian M…
236 8.1 High Noon PG Western 85 [u’Gary Cooper’, u’Grace Kelly’, u’Thomas Mitc…
704 7.6 High Plains Drifter R Western 105 [u’Clint Eastwood’, u’Verna Bloom’, u’Marianna…
26 8.6 Once Upon a Time in the West PG-13 Western 175 [u’Henry Fonda’, u’Charles Bronson’, u’Claudia…
263 8.1 Rio Bravo NOT RATED Western 141 [u’John Wayne’, u’Dean Martin’, u’Ricky Nelson’]
6 8.9 The Good, the Bad and the Ugly NOT RATED Western 161 [u’Clint Eastwood’, u’Eli Wallach’, u’Lee Van …
421 7.9 The Outlaw Josey Wales PG Western 135 [u’Clint Eastwood’, u’Sondra Locke’, u’Chief D…
119 8.3 Unforgiven R Western 131 [u’Clint Eastwood’, u’Gene Hackman’, u’Morgan …

979 rows × 6 columns

Yukarıda gördüğümüz gibi önce genre niteliğine göre sıraladık sonra her bir genre için ayrı ayrı title niteliği sıralandı.

Pandas Dataframe Artan/Azalan Sıralama

Sıralamanın küçükten büyüğe mi yoksa büyükten küçüğe mi (artan/azalan) olacağını ascending=False veya True parametresiyle belirliyoruz. Eğer True ise ki varsayılan değerdir, artan sıralama olur. False ise azalan sıralama olur.

Diğer bölümde görüşmek üzere veriyle kalın…

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…

Bölüm 5 – String

Bu yazımızda string ağırlıklı örnekler vereceğim. Veri hazırlığı ve temizliğinde string düzenlemeleri sıkça yapılmaktadır. Büyük harf küçük harf, boşlukları temizleme, içinde geçeni bulma vb. Konuyla ilgili çok daha fazla bilgi şu adresten bulunabilir.

Veri setimizi indirelim.

import pandas as pd
filmListesi = pd.read_csv("https://raw.githubusercontent.com/erkansirin78/datasets/master/imdb_1000.csv")
filmListesi.head()
  star_rating title content_rating genre duration actors_list
0 9.3 The Shawshank Redemption R Crime 142 [u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…
1 9.2 The Godfather R Crime 175 [u’Marlon Brando’, u’Al Pacino’, u’James Caan’]
2 9.1 The Godfather: Part II R Crime 200 [u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…
3 9.0 The Dark Knight PG-13 Action 152 [u’Christian Bale’, u’Heath Ledger’, u’Aaron E…
4 8.9 Pulp Fiction R Crime 154 [u’John Travolta’, u’Uma Thurman’, u’Samuel L….

Tablomuzun ilk beş satırı yukarıda görüldüğü gibidir. Hadi basitten başlayalım ve title_upper adında yeni bir sütuna title büyük harflerle koyalım.

filmListesi['title_buyuk'] = filmListesi.title.str.upper()
filmListesi.head()
  star_rating title content_rating genre duration actors_list title_buyuk
0 9.3 The Shawshank Redemption R Crime 142 [u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt… THE SHAWSHANK REDEMPTION
1 9.2 The Godfather R Crime 175 [u’Marlon Brando’, u’Al Pacino’, u’James Caan’] THE GODFATHER
2 9.1 The Godfather: Part II R Crime 200 [u’Al Pacino’, u’Robert De Niro’, u’Robert Duv… THE GODFATHER: PART II
3 9.0 The Dark Knight PG-13 Action 152 [u’Christian Bale’, u’Heath Ledger’, u’Aaron E… THE DARK KNIGHT
4 8.9 Pulp Fiction R Crime 154 [u’John Travolta’, u’Uma Thurman’, u’Samuel L…. PULP FICTION

Şimdi içinde John Travolta içeren satırları görelim.

filmListesi[filmListesi.actors_list.str.contains('John Travolta')]
  star_rating title content_rating genre duration actors_list title_buyuk
4 8.9 Pulp Fiction R Crime 154 [u’John Travolta’, u’Uma Thurman’, u’Samuel L…. PULP FICTION

Yukarıda bir önceki yazıda ele aldığımız filtrelemeyi kullandık.

Şimdi biraz replace() metoduyla birkaç örnek yapalım. actor_list‘te köşeli parantezler hiç güzel görünmüyor. Okunabilirliği arttırmak adına onları kaldıralım.

filmListesi.actors_list.str.replace('[','').str.replace(']','')
0       u'Tim Robbins', u'Morgan Freeman', u'Bob Gunton'
1          u'Marlon Brando', u'Al Pacino', u'James Caan'
2      u'Al Pacino', u'Robert De Niro', u'Robert Duvall'
3      u'Christian Bale', u'Heath Ledger', u'Aaron Ec...
4      u'John Travolta', u'Uma Thurman', u'Samuel L. ...
5       u'Henry Fonda', u'Lee J. Cobb', u'Martin Balsam'
6      u'Clint Eastwood', u'Eli Wallach', u'Lee Van C...
7      u'Elijah Wood', u'Viggo Mortensen', u'Ian McKe...
8      u'Liam Neeson', u'Ralph Fiennes', u'Ben Kingsley'
9      u'Brad Pitt', u'Edward Norton', u'Helena Bonha...
10     u'Elijah Wood', u'Ian McKellen', u'Orlando Bloom'
11     u'Leonardo DiCaprio', u'Joseph Gordon-Levitt',...
12     u'Mark Hamill', u'Harrison Ford', u'Carrie Fis...
13         u'Tom Hanks', u'Robin Wright', u'Gary Sinise'
14     u'Elijah Wood', u'Ian McKellen', u'Viggo Morte...

Gördüğümüz gibi köşeli parantezler gitti. Şimdi köşeli parantezlere ilaveten u’ karakterlerini de boşlukla değiştirelim.

filmListesi.actors_list.str.replace("u'",'').str.replace('[','').str.replace(']','').str.replace("'",'')
0                Tim Robbins, Morgan Freeman, Bob Gunton
1                   Marlon Brando, Al Pacino, James Caan
2               Al Pacino, Robert De Niro, Robert Duvall
3            Christian Bale, Heath Ledger, Aaron Eckhart
4          John Travolta, Uma Thurman, Samuel L. Jackson
5                Henry Fonda, Lee J. Cobb, Martin Balsam
6             Clint Eastwood, Eli Wallach, Lee Van Cleef
7             Elijah Wood, Viggo Mortensen, Ian McKellen
8               Liam Neeson, Ralph Fiennes, Ben Kingsley
9         Brad Pitt, Edward Norton, Helena Bonham Carter
10              Elijah Wood, Ian McKellen, Orlando Bloom
11     Leonardo DiCaprio, Joseph Gordon-Levitt, Ellen...
12             Mark Hamill, Harrison Ford, Carrie Fisher
13                  Tom Hanks, Robin Wright, Gary Sinise
14            Elijah Wood, Ian McKellen, Viggo Mortensen

Gördüğünüz gibi zincirleme şekilde birden fazla str.replace() kullanabiliyoruz.

Pandas Series’den Pandas Dataframe Oluşturmak

Pandas series dediğimiz Pandas Dataframe (tablo) bir sütunu aslında. Ancak dataframe ce series in farklı metodları olduğundan zaman zaman seriesi dataframe dönüştürmek durumunda kalabiliyoruz. Bunun için basti bir yöntem var: to_dataframe()

actor_series = filmListesi.actors_list.to_dataframe()

Yukarıdaki komutla actor_series adında bir Pandas Dataframe oluşturduk.

[wpcode id="22333"]