
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.
2 Responses
Bir yanıt yazın Yanıtı iptal et
Yorum yapabilmek için oturum açmalısınız.
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.