Veri Bilimi Okulu

Python Pandas ile Temel İşlemler
pandas_basic_df_ops_kapak

Loading

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()
 CityColors ReportedShape ReportedStateTime
0IthacaNaNTRIANGLENY6/1/1930 22:00
1WillingboroNaNOTHERNJ6/30/1930 20:00
2HolyokeNaNOVALCO2/15/1931 14:00
3AbileneNaNDISKKS6/1/1931 13:00
4New York Worlds FairNaNLIGHTNY4/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()
 SehirRenkSekilEyaletZaman
0IthacaNaNTRIANGLENY6/1/1930 22:00
1WillingboroNaNOTHERNJ6/30/1930 20:00
2HolyokeNaNOVALCO2/15/1931 14:00
3AbileneNaNDISKKS6/1/1931 13:00
4New York Worlds FairNaNLIGHTNY4/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
 SehirRenkSekilEyaletZamanSehirEyalet
0IthacaNaNTRIANGLENY6/1/1930 22:00NY, Ithaca
1WillingboroNaNOTHERNJ6/30/1930 20:00NJ, Willingboro
2HolyokeNaNOVALCO2/15/1931 14:00CO, Holyoke
3AbileneNaNDISKKS6/1/1931 13:00KS, Abilene
4New York Worlds FairNaNLIGHTNY4/18/1933 19:00NY, 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()
 CityColors ReportedShape ReportedStateTimenufus
0IthacaNaNTRIANGLENY6/1/1930 22:0081348
1WillingboroNaNOTHERNJ6/30/1930 20:0050670
2HolyokeNaNOVALCO2/15/1931 14:0084373
3AbileneNaNDISKKS6/1/1931 13:0083502
4New York Worlds FairNaNLIGHTNY4/18/1933 19:0058124

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()
 CityColors ReportedShape ReportedStateTime
2HolyokeNaNOVALCO2/15/1931 14:00
3AbileneNaNDISKKS6/1/1931 13:00
4New York Worlds FairNaNLIGHTNY4/18/1933 19:00
5Valley CityNaNDISKND9/15/1934 15:30
6Crater LakeNaNCIRCLECA6/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_ratingtitlecontent_ratinggenredurationactors_list
09.3The Shawshank RedemptionRCrime142[u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…
19.2The GodfatherRCrime175[u’Marlon Brando’, u’Al Pacino’, u’James Caan’]
29.1The Godfather: Part IIRCrime200[u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…
39.0The Dark KnightPG-13Action152[u’Christian Bale’, u’Heath Ledger’, u’Aaron E…
48.9Pulp FictionRCrime154[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_ratingtitlecontent_ratinggenredurationactors_list
5427.8(500) Days of SummerPG-13Comedy95[u’Zooey Deschanel’, u’Joseph Gordon-Levitt’, …
58.912 Angry MenNOT RATEDDrama96[u’Henry Fonda’, u’Lee J. Cobb’, u’Martin Bals…
2018.112 Years a SlaveRBiography134[u’Chiwetel Ejiofor’, u’Michael Kenneth Willia…
6987.6127 HoursRAdventure94[u’James Franco’, u’Amber Tamblyn’, u’Kate Mara’]
1108.32001: A Space OdysseyGMystery160[u’Keir Dullea’, u’Gary Lockwood’, u’William S…
9107.52046RDrama129[u’Tony Chiu Wai Leung’, u’Ziyi Zhang’, u’Faye…
5967.721 GramsRCrime124[u’Sean Penn’, u’Benicio Del Toro’, u’Naomi Wa…

….

 star_ratingtitlecontent_ratinggenredurationactors_list
2808.1Young FrankensteinPGComedy106[u’Gene Wilder’, u’Madeline Kahn’, u’Marty Fel…
5357.8ZeligPGComedy79[u’Woody Allen’, u’Mia Farrow’, u’Patrick Horg…
9557.4Zero Dark ThirtyRDrama157[u’Jessica Chastain’, u’Joel Edgerton’, u’Chri…
6777.7ZodiacRCrime157[u’Jake Gyllenhaal’, u’Robert Downey Jr.’, u’M…
6157.7ZombielandRComedy88[u’Jesse Eisenberg’, u’Emma Stone’, u’Woody Ha…
5267.8ZuluUNRATEDDrama138[u’Stanley Baker’, u’Jack Hawkins’, u’Ulla Jac…
8647.5[Rec]RHorror78[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_ratingtitlecontent_ratinggenredurationactors_list
5707.8300RAction117[u’Gerard Butler’, u’Lena Headey’, u’David Wen…
2768.1A Fistful of DollarsRAction99[u’Clint Eastwood’, u’Gian Maria Volont\xe9′, …
758.4AliensRAction137[u’Sigourney Weaver’, u’Michael Biehn’, u’Carr…
5297.8ApocalyptoRAction139[u’Gerardo Taracena’, u’Raoul Trujillo’, u’Dal…
4337.9AvatarPG-13Action162[u’Sam Worthington’, u’Zoe Saldana’, u’Sigourn…
8017.6BatmanPG-13Action126[u’Michael Keaton’, u’Jack Nicholson’, u’Kim B…
1138.3Batman BeginsPG-13Action140[u’Christian Bale’, u’Michael Caine’, u’Ken Wa…
5737.8Battle RoyaleNOT RATEDAction114[u’Tatsuya Fujiwara’, u’Aki Maeda’, u’Tar\xf4 …
828.4BraveheartRAction177[u’Mel Gibson’, u’Sophie Marceau’, u’Patrick M…
9087.5BullittPGAction114[u’Steve McQueen’, u’Jacqueline Bisset’, u’Rob…
5177.8Captain America: The Winter SoldierPG-13Action136[u’Chris Evans’, u’Samuel L. Jackson’, u’Scarl…
3808.0Casino RoyalePG-13Action144[u’Daniel Craig’, u’Eva Green’, u’Judi Dench’]
4377.9Crouching Tiger, Hidden DragonPG-13Action120[u’Yun-Fat Chow’, u’Michelle Yeoh’, u’Ziyi Zha…
6237.7Dawn of the Planet of the ApesPG-13Action130[u’Gary Oldman’, u’Keri Russell’, u’Andy Serkis’]
1388.3Die HardRAction131[u’Bruce Willis’, u’Alan Rickman’, u’Bonnie Be…
7787.6Die Hard: With a VengeanceRAction131[u’Bruce Willis’, u’Jeremy Irons’, u’Samuel L….
5157.8Dirty HarryRAction102[u’Clint Eastwood’, u’Andrew Robinson’, u’Harr…
3498.0District 9RAction112[u’Sharlto Copley’, u’David James’, u’Jason Co…
3918.0Edge of TomorrowPG-13Action113[u’Tom Cruise’, u’Emily Blunt’, u’Bill Paxton’]
2618.1Elite SquadRAction115[u’Wagner Moura’, u’Andr\xe9 Ramiro’, u’Caio J…
2398.1Elite Squad: The Enemy WithinUNRATEDAction115[u’Wagner Moura’, u’Irandhir Santos’, u’Andr\x…
6107.7Enter the DragonRAction102[u’Bruce Lee’, u’John Saxon’, u’Jim Kelly’]
8157.6EquilibriumRAction107[u’Christian Bale’, u’Sean Bean’, u’Emily Wats…
7537.6Escape from AlcatrazPGAction112[u’Clint Eastwood’, u’Patrick McGoohan’, u’Rob…
6537.7FearlessPG-13Action104[u’Jet Li’, u’Li Sun’, u’Yong Dong’]
6857.7First BloodRAction93[u’Sylvester Stallone’, u’Brian Dennehy’, u’Ri…
6197.7Forbidden PlanetPASSEDAction98[u’Walter Pidgeon’, u’Anne Francis’, u’Leslie …
8967.5From Russia with LoveAPPROVEDAction115[u’Sean Connery’, u’Robert Shaw’, u’Lotte Lenya’]
3018.0Furious 7PG-13Action137[u’Vin Diesel’, u’Paul Walker’, u’Dwayne Johns…
6837.7FuryRAction134[u’Brad Pitt’, u’Shia LaBeouf’, u’Logan Lerman’]
388.6Rear WindowAPPROVEDMystery112[u’James Stewart’, u’Grace Kelly’, u’Wendell C…
1498.2RebeccaNOT RATEDMystery130[u’Laurence Olivier’, u’Joan Fontaine’, u’Geor…
2448.1Shutter IslandRMystery138[u’Leonardo DiCaprio’, u’Emily Mortimer’, u’Ma…
2498.1SleuthPGMystery138[u’Laurence Olivier’, u’Michael Caine’, u’Alec…
8947.5Source CodePG-13Mystery93[u’Jake Gyllenhaal’, u’Michelle Monaghan’, u’V…
4677.9The 39 StepsUNRATEDMystery86[u’Robert Donat’, u’Madeleine Carroll’, u’Luci…
2928.1The Manchurian CandidateAPPROVEDMystery126[u’Frank Sinatra’, u’Laurence Harvey’, u’Janet…
8637.5Three Days of the CondorRMystery117[u’Robert Redford’, u’Faye Dunaway’, u’Cliff R…
8667.5To Catch a ThiefAPPROVEDMystery106[u’Cary Grant’, u’Grace Kelly’, u’Jessie Royce…
2648.1Twelve MonkeysRMystery129[u’Bruce Willis’, u’Madeleine Stowe’, u’Brad P…
768.4VertigoAPPROVEDMystery128[u’James Stewart’, u’Kim Novak’, u’Barbara Bel…
1458.2Blade RunnerRSci-Fi117[u’Harrison Ford’, u’Rutger Hauer’, u’Sean You…
3218.0BrazilRSci-Fi132[u’Jonathan Pryce’, u’Kim Greist’, u’Robert De…
4087.9GravityPG-13Sci-Fi91[u’Sandra Bullock’, u’George Clooney’, u’Ed Ha…
6377.7The Butterfly EffectRSci-Fi113[u’Ashton Kutcher’, u’Amy Smart’, u’Melora Wal…
4847.8The Day the Earth Stood StillAPPROVEDSci-Fi92[u’Michael Rennie’, u’Patricia Neal’, u’Hugh M…
9027.5FrenzyRThriller116[u’Jon Finch’, u’Barry Foster’, u’Alec McCowen’]
7287.6La piel que habitoRThriller120[u’Antonio Banderas’, u’Elena Anaya’, u’Jan Co…
4967.8MiseryRThriller107[u’James Caan’, u’Kathy Bates’, u’Richard Farn…
3508.0Shadow of a DoubtAPPROVEDThriller108[u’Teresa Wright’, u’Joseph Cotten’, u’Macdona…
8487.5The Man Who Knew Too MuchPGThriller120[u’James Stewart’, u’Doris Day’, u’Brenda de B…
598.5Django UnchainedRWestern165[u’Jamie Foxx’, u’Christoph Waltz’, u’Leonardo…
1078.3For a Few Dollars MoreAPPROVEDWestern132[u’Clint Eastwood’, u’Lee Van Cleef’, u’Gian M…
2368.1High NoonPGWestern85[u’Gary Cooper’, u’Grace Kelly’, u’Thomas Mitc…
7047.6High Plains DrifterRWestern105[u’Clint Eastwood’, u’Verna Bloom’, u’Marianna…
268.6Once Upon a Time in the WestPG-13Western175[u’Henry Fonda’, u’Charles Bronson’, u’Claudia…
2638.1Rio BravoNOT RATEDWestern141[u’John Wayne’, u’Dean Martin’, u’Ricky Nelson’]
68.9The Good, the Bad and the UglyNOT RATEDWestern161[u’Clint Eastwood’, u’Eli Wallach’, u’Lee Van …
4217.9The Outlaw Josey WalesPGWestern135[u’Clint Eastwood’, u’Sondra Locke’, u’Chief D…
1198.3UnforgivenRWestern131[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_ratingtitlecontent_ratinggenredurationactors_listuzunlukKategori
09.3The Shawshank RedemptionRCrime142[u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…Cok Uzun
19.2The GodfatherRCrime175[u’Marlon Brando’, u’Al Pacino’, u’James Caan’]Cok Uzun
29.1The Godfather: Part IIRCrime200[u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…Cok Uzun
39.0The Dark KnightPG-13Action152[u’Christian Bale’, u’Heath Ledger’, u’Aaron E…Cok Uzun
48.9Pulp FictionRCrime154[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_ratingtitlecontent_ratinggenredurationactors_listuzunlukKategori
378.6Raiders of the Lost ArkPGAction115[u’Harrison Ford’, u’Karen Allen’, u’Paul Free…Normal
968.4YojimboUNRATEDAction110[u’Toshir\xf4 Mifune’, u’Eijir\xf4 T\xf4no’, u…Normal
1238.3The GeneralUNRATEDAction107[u’Buster Keaton’, u’Marion Mack’, u’Glen Cave…Normal
1988.1Kill Bill: Vol. 1RAction111[u’Uma Thurman’, u’David Carradine’, u’Daryl H…Normal
2358.1Yip ManRAction106[u’Donnie Yen’, u’Simon Yam’, u’Siu-Wong Fan’]Normal
2398.1Elite Squad: The Enemy WithinUNRATEDAction115[u’Wagner Moura’, u’Irandhir Santos’, u’Andr\x…Normal
2408.1The Bourne UltimatumPG-13Action115[u’Matt Damon’, u’\xc9dgar Ram\xedrez’, u’Joan…Normal
2618.1Elite SquadRAction115[u’Wagner Moura’, u’Andr\xe9 Ramiro’, u’Caio J…Normal
2768.1A Fistful of DollarsRAction99[u’Clint Eastwood’, u’Gian Maria Volont\xe9′, …Normal
2818.1The TerminatorRAction107[u’Arnold Schwarzenegger’, u’Linda Hamilton’, …Normal
3278.0The Adventures of Robin HoodPGAction102[u’Errol Flynn’, u’Olivia de Havilland’, u’Bas…Normal
3498.0District 9RAction112[u’Sharlto Copley’, u’David James’, u’Jason Co…Normal
3668.0SerenityPG-13Action119[u’Nathan Fillion’, u’Gina Torres’, u’Chiwetel…Normal
3918.0Edge of TomorrowPG-13Action113[u’Tom Cruise’, u’Emily Blunt’, u’Bill Paxton’]Normal
4017.9The KillerRAction111[u’Yun-Fat Chow’, u’Danny Lee’, u’Sally Yeh’]Normal
4037.9Ying xiongPG-13Action99[u’Jet Li’, u’Tony Chiu Wai Leung’, u’Maggie C…Normal
4117.9The Bourne IdentityPG-13Action119[u’Franka Potente’, u’Matt Damon’, u’Chris Coo…Normal
4377.9Crouching Tiger, Hidden DragonPG-13Action120[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_ratingtitlecontent_ratinggenredurationactors_listuzunlukKategori
09.3The Shawshank RedemptionRCrime142[u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…Cok Uzun
19.2The GodfatherRCrime175[u’Marlon Brando’, u’Al Pacino’, u’James Caan’]Cok Uzun
29.1The Godfather: Part IIRCrime200[u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…Cok Uzun
39.0The Dark KnightPG-13Action152[u’Christian Bale’, u’Heath Ledger’, u’Aaron E…Cok Uzun
78.9The Lord of the Rings: The Return of the KingPG-13Adventure201[u’Elijah Wood’, u’Viggo Mortensen’, u’Ian McK…Cok Uzun
108.8The Lord of the Rings: The Fellowship of the RingPG-13Adventure178[u’Elijah Wood’, u’Ian McKellen’, u’Orlando Bl…Cok Uzun
148.8The Lord of the Rings: The Two TowersPG-13Adventure179[u’Elijah Wood’, u’Ian McKellen’, u’Viggo Mort…Cok Uzun
158.7InterstellarPG-13Adventure169[u’Matthew McConaughey’, u’Anne Hathaway’, u’J…Cok Uzun
548.5Back to the FuturePGAdventure116[u’Michael J. Fox’, u’Christopher Lloyd’, u’Le…Normal
688.4Das BootRAdventure149[u’J\xfcrgen Prochnow’, u’Herbert Gr\xf6nemeye…Cok Uzun
718.4North by NorthwestAPPROVEDAdventure136[u’Cary Grant’, u’Eva Marie Saint’, u’James Ma…Cok Uzun
858.4Lawrence of ArabiaPGAdventure216[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)
 meanmaxmincount
genre    
Western8.2555568.97.69
Film-Noir8.0333338.37.73
History8.0000008.08.01
Mystery7.9750008.67.416
Adventure7.9333338.97.475
Sci-Fi7.9200008.27.75
Crime7.9169359.37.4124
Animation7.9145168.67.462
Drama7.9025188.97.4278
Action7.8845599.07.4136
Biography7.8623388.97.477
Family7.8500007.97.82
Comedy7.8224368.67.4156
Horror7.8068978.67.429
Fantasy7.7000007.77.71
Thriller7.6800008.07.55

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_ratingtitlecontent_ratinggenredurationactors_list
09.3The Shawshank RedemptionRCrime142[u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…
19.2The GodfatherRCrime175[u’Marlon Brando’, u’Al Pacino’, u’James Caan’]
29.1The Godfather: Part IIRCrime200[u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…
39.0The Dark KnightPG-13Action152[u’Christian Bale’, u’Heath Ledger’, u’Aaron E…
48.9Pulp FictionRCrime154[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_ratingtitlecontent_ratinggenredurationactors_listtitle_buyuk
09.3The Shawshank RedemptionRCrime142[u’Tim Robbins’, u’Morgan Freeman’, u’Bob Gunt…THE SHAWSHANK REDEMPTION
19.2The GodfatherRCrime175[u’Marlon Brando’, u’Al Pacino’, u’James Caan’]THE GODFATHER
29.1The Godfather: Part IIRCrime200[u’Al Pacino’, u’Robert De Niro’, u’Robert Duv…THE GODFATHER: PART II
39.0The Dark KnightPG-13Action152[u’Christian Bale’, u’Heath Ledger’, u’Aaron E…THE DARK KNIGHT
48.9Pulp FictionRCrime154[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_ratingtitlecontent_ratinggenredurationactors_listtitle_buyuk
48.9Pulp FictionRCrime154[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.

0

2 Responses

  1. 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.

Bir yanıt yazın

Password Requirements:

  • At least 8 characters
  • At least 1 lowercase letter
  • At least 1 uppercase letter
  • At least 1 numerical number
  • At least 1 special character