Site Loader

Herkese Selamlar, Veri Bilimi yolculuğunda ilerlerken olmazsa olmaz Pandas kütüphanesini sizlere anlatmaya çalışacağım. Pandas giriş yazısında neler göreceğiz? Elbette Pandas kütüphensinin binlerce fonksiyon ve metotları mevcut fakat biz burada en sık ihtiyacımız olanları göreceğiz.

Pandas Giriş Yazı İçeriği;

  • Pandas Nedir?
  • Pandas Veri Yapıları
  • Pandas Series
  • DataFrame Okuma İşlemleri
  • DataFrame Sorgulama İşlemleri
  • DataFrame Güncelleme İşlemleri
  • DataFrame Silme İşlemleri

Pandas Nedir?

Veri bilimi projeleri verilerin toplanması ve temizlenmesi ile başlar. Bu süreçler veri bilimi projelerine göre %60 – %80’ni oluşturur. İşte Pandas’ta bu süreçlerde en çok kullandığımız kütüphanelerden biridir. Biz Pandas ile verileri okuyacağız, Pandas ile verile anlamaya çalışacağız, Pandas ile verileri temizleyip düzenleyeceğiz ve Pandas ile verileri görselleştireceğiz.

Pandas Kullanımı;

Kullanımı çok kolay olduğu gibi bu kütüphanenin indirilmesi  de çok kolaydır.

Pandas indirme

pip install pandas

Pandas projeye ekleme

import pandas as pd

Pandas Versiyonu

pd.__version__

'1.2.5'

Pandas Veri Yapıları

Pandas veri yapıları genel olarak en çok kullanılan iki tür veri yapısı mevcuttur.

  • Series
  • DataFrame

Series

Pandas series veri türü liste ve Numpy array’lere benzeyen tek boyutlu veri türüdür. Pandas series veri türünü excel deki bir sütundaki verilere benzetebilirsiniz.

Series Veri Türünü Oluşturmak

Bu veri türü çok basit bir yapıya sahiptir hemen oluşturalım.

series1 = pd.Series([1,2,3,4,5,6])
series1


0    1
1    2
2    3
3    4
4    5
5    6
dtype: int64

veya daha önce oluşturulan bir dizi veya listeyi series veri türüne dönüştürebiliriz.

list1 = ['a','b','c','d','e','f']

series2 = pd.Series(list1)
series2

0    a
1    b
2    c
3    d
4    e
5    f
dtype: object

 

Series Veri Türü Elemanlara Erişmek

Series veri türü elemanlara erişmek listelerde olduğu gibidir.

series1[5]
6
series1[2:6]

2    3
3    4
4    5
5    6
dtype: int64

İlk 5 elaman

series1[:5]
0    1
1    2
2    3
3    4
4    5
dtype: int64

Veya

series1.head(5)
0    1
1    2
2    3
3    4
4    5
dtype: int64

Görüldüğü gibi head ile çok daha kolay ilk beş veriyi aldık. Head fonksiyonu gibi birçok fonksiyon mevcuttur series veri türleri için. Hepsini görmek için dir() fonksiyonumu kullanabilirisiniz.

dir(pd.Series)


Çıkan fonksiyonlar, method veya class’ları kullanabilirsiniz.

Matematiksel İşlemler

Daha önceki yazılarımda Numpy kütüphanesini anlatmıştım ve Numpy kütüphanesinin aslında bir matematiksel işlemler yapmamızı sağladığını görmüştük. Pandas  ta Numpy kütüphanesi üzerine kurulmuş olan bir kütüphenedir biz Pandas’ta da matematiksel işlemler yapabiliriz.

series1 = pd.Series([1,2,3,4,5,6,7])

print(series1.mean())
print(series1.min())
print(series1.median())
print(series1.sum())

4.0
1
4.0
28

Sorgulama İşlemleri

Evet biz seriler üzerinde de sorgu işlemleri yapabiliriz.

series1>4
0    False
1    False
2    False
3    False
4     True
5     True
6     True
dtype: bool

Koşulu sağlayan değeleri True sağlamayanları ise False olarak döndürdü bize. Fakat biz bu şekilde değil de koşulu elemanları görmek istiyorsak. Nasıl yapmalıyız?

series1[series1>5]

4    5
5    6
6    7
dtype: int64

 

DataFrame

Pandas  DataFrame veri türü bizim ençok kullanacağımız veri türüdür. Bu veri türü çok boyutlu yapıya sahip veri türüdür. Örneğin veritabanı içindeki bir tablo olarak düşünebilirsiniz.

DataFrame Oluşturmak

Dataframe veritürüne biz çok boyutlu veri türü dedik o zaman burada bu veri iki kısımdan oluşacak. Anahtar ve değer veya veritabanı içindeki satır ve sütun gibi. Peki bu veri yapısı tanıdık geldi mi? Aslında bu veri türü dictionary veya json çok benzer.

dict1 = {"Name":["Ali","Ahmet","Kenan","Can","Berk"],
                 "Age":[21,25,36,17,20]}


df = pd.DataFrame(dict1)
df

Görüldüğü gibi veri türü bir tablo yapısı ile aynıdır.

Pandas ile Keşifsel Veri Analizi

DataFrame ne olduğunu öğrendiğimize göre artık daha detaylı bir şekilde incelemeye başlayabiliriz.

df = pd.read_csv("Mall_Customers.csv")
df

Verisetini Anlama

Görüldüğü gibi dataFrame olarak dosyayı okuduk ve dataFrame  isimini yazarak dataFrame okuduk ama eğer biz dataFrame tamamını değil de bazı kısımları almak istiyorsak;

  • head() ile ilk satırları
  • tail() ile son satırları
  • sample() ile kaşık olarak dataFrame okuyabiliyoruz.

Peki veriseti hakkında genel bilgi almak istiyorsak, o zaman info() fonksiyonunu kullanacağız.

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype  
---  ------                  --------------  -----  
 0   CustomerID              200 non-null    int64  
 1   Genre                   193 non-null    object 
 2   Age                     195 non-null    float64
 3   Annual Income (k$)      185 non-null    float64
 4   Spending Score (1-100)  198 non-null    float64
dtypes: float64(3), int64(1), object(1)
memory usage: 7.9+ KB

Burada verisetinde kaç tane satır var kaç tane sütun var sütunların veri türünü boş olmayan gözlem sayısını görebiliyoruz. Peki boş olan değer sayılarını nasıl bulacağız.

df.isnull().sum()

CustomerID                 0
Genre                      7
Age                        5
Annual Income (k$)        15
Spending Score (1-100)     2
dtype: int64

Peki sadece sütunları görmek istiyorsak o zaman columns  metodunu kullanıyor olacağız.

df.columns

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Görüldüğü gibi sütunları aldık eğer bu sütunlar ile birlikte türlerini de almak istiyorsak o zaman dtypes metodunu kullanacağız.

df.dtypes

CustomerID                  int64
Genre                      object
Age                       float64
Annual Income (k$)        float64
Spending Score (1-100)    float64
dtype: object

Şimdi verseti yapısına biraz değinelim info()  fonksiyonu ile satır sayısını ve sütunları görmüştük fakat biz sadece satır ve sütun sayısını görmek istiyorsak o zaman shape  metodunu kullanacağız.

df.shape

(200, 5)

Evet verisetimiz 200 satır 5 sütundan oluşuyor. Peki kaç tane gözlem var veriseti içerisinde derseniz aslında çok basit satır ve sütun sayısını çarparak öğrenebiliriz. Yani 1000 tane gözlem var seriseti içerisinde peki bunun için bir metot yok mu elbette var. Bu işlem için size metodunu kullanıyoruz.

df.size
1000

Peki veriseti kaç boyutlu?

df.ndim

2

Veriseti satır ve sütün olmak üzere iki boyutlu bir veri türüdür.

Şimdi satır ve sütunlar üzerinde detaylı bilgiler öğrenelim.

df.describe()

Describe fonksiyonu bize veriseti içindeki sayısal sütunların min, max, ortalama, standart sapma gibi değerlerini verdi. Görüldüğü gibi eğer describe() fonksiyonuna herhangi bir parametre verilmez ise default olarak sayısal değeleri alır. Eğer describe() fonksiyonuna include=[‘O’] değeri verilirse kategorik sütunları alır.

df.describe(include=['O'])

Tek bir Object türünde sütun olduğu için bu şekilde bir sonuç verdi. Eğer bütün Object türünde sütunları değil de sadece tek bir sütun almak istersek belirtiyoruz. Aynı işlem sayısal sütunlar içinde geçerli.

df.Genre.describe()

count        193
unique         2
top       Female
freq         107
Name: Genre, dtype: object

Burada ise toplam boş olmayan gözlem sayısını farklı değer sayısını ve en çok olan  değeri bize verdi.

Biz bu bütün değerlerin sayısını görmek istiyorsak o zaman value_counts() fonksiyonunu kullanabiliriz.

df.Genre.value_counts()

Female    107
Male       86
Name: Genre, dtype: int64

Sıralama İşlemleri

Görüldüğü gibi eleman sayısı çok olandan az olana doğru sıralanmış biz bunun tam tersini yapmak istersek o zaman sort_values() fonksiyonunu kullanabiliriz.

df.Genre.value_counts().sort_values()

Male       86
Female    107
Name: Genre, dtype: int64

Bu fonksiyonu aynı zamanda tüm veri üzerinde de kullanabiliriz.

df.sort_values(by ="Spending Score (1-100)", ascending =False)

Görüldüğü gibi tüm verisetini üzerinde Spending Score sütununa göre büyükten küçüğe sıraladık. Bunu aynı anda birden fazla sütün üzerinde yapabiliriz. Örneğin  Spending Score aynı olan iki satırı bu sefer Age sütununa göre sıralayacağız.

df.sort_values(by =["Spending Score (1-100)","Age"], ascending =[False,False])

Şimdi dikkat ederseniz 145 ve 185 indexli satırlar yer değiştirdi.

Sorgulama İşlemleri

Biz tüm verisetini aldık, ilk satırları aldık, son satırları aldık ve rastgele verileri aldık peki bir koşulu sağlayan satırları nasıl alabiliriz örneğin Age sütunu içinde 67’den büyük olan satırları alalım.

df[df.Age >67]

Çok güzel istediğimiz sonucu aldık peki hem Age sütunu içinde 67’den büyük değerleri hem de Spending Score içinde 50’den büyük değerleri nasıl alırım.

df[(df["Age"] >67) & (df["Spending Score (1-100)"]>50)]

Süper şimdi biz istediğimiz sonucu almış olduk fakat biz burada tüm sütunları değil sadece belirlediğimiz sütunları nasıl alabiliriz? Hemen yazalım;

df[(df["Age"] >67) & (df["Spending Score (1-100)"]>50)][["CustomerID","Age","Spending Score (1-100)"]]

Harika gidiyoruz. Hadi gelin biraz daha ekleme yapalım ve sonuçları önce Age sonrada Spending Score sütunlarına göre küçükten büyüğe sıralayalım.

df[(df["Age"] >67) & (df["Spending Score (1-100)"]>50)][["CustomerID","Age","Spending Score (1-100)"]].sort_values(by=["Age","Spending Score (1-100)"],ascending=[True,True])

Görüldüğü gibi elimizde atık daha temiz daha düzenli bir çıktı. Sizce de burada eksik bir şeyler duyar gibiyim  evet farkettiğiniz gibi indexler orijinal veriden alındığı gibi fakat bu düzenli değil. Hadi son bir işlem daha yapalım indexleri sıralayalım.

df[(df["Age"] >67) & (df["Spending Score (1-100)"]>50)][["CustomerID","Age","Spending Score (1-100)"]].sort_values(by=["Age","Spending Score (1-100)"],ascending=[True,True]).reset_index()

Artık elimizde çok daha mükemmel bir çıktı var.

Güncelleme İşlemleri

Şuana kadar dataFrame üzerinde sorgulama, sıralama gibi değişiklikler yaptık şimdi ise bu dataFrame üzerinde bazı değişiklikler yapmaya çalışalım.

 DataFrame Değerleri Değiştime

Örneğin 1. index de ki Age sütunda ki değer 21 değeri  biz bunu 23 yapalım.

df.Age[2] = 23

Aslında yaptığımızın bir anlamı şuan pek gelmiyor olabilir ama biz örneğin belli bir koşulu sağlayan değerleri değiştirmek isteyebiliriz.

df[df["Spending Score (1-100)"]<5]

Spending Score  değeri 5’ten küçük olanları görüyoruz biz bu score ekleyerek 5’ten küçük score görmek istemediğimiz için hepsini 5 yapıyoruz.

df[df["Spending Score (1-100)"]<5]=5

Scoru 5’ten küçük verimiz kalmamış oldu.

Burada asıl önemli olan konu Pandas kütüphanesini anlatmak. Eksik verileri  buradan detaylı bir şekilde öğrenebilirsiniz. Biz eksik verileri görmek istemiyoruz çünkü bizim için bir şey ifade etmiyor ya sileceğiz veya yeni bir değer atayacağız.

Şuan ki başlığımız değiştirme olduğu için biz değiştirelim. Örneğin Age sütunun da ki eksik sütunları ortalama yaş değeri atayalım bunun için fillna fonksiyonunu kullanabiliriz.

İlk önce eksik verilerimizi bir bulalım.

df.Age.isnull().sum()
5


Şimdi değerleri değiştirelim.

df.Age = df.Age.fillna(df.Age.mean())

Tekrar boş değerleri sorgulayalım.

df.Age.isnull().sum()

0

Sütun İsimini Değiştirme

DataFrame üzerinde bir sütun isimini rename() fonksiyonu ile değiştiriyoruz.

df.rename(columns={"Spending Score (1-100)": "spending_score"})

Daha kullanılabilir hale getirmek için sütun ismini değiştirdik. Tekrar dataFrame bir görelim.

df

Görüldüğü gibi eski haline dönmüş ama biz değiştirmiştik. Hayır aslında biz değiştirmedik sadece görmek istediğimiz için o şekilde göstermiş olduk. Peki kalıcı olarak nasıl değiştiririm. İşte burada inplace  metodunu kullanıyoruz. Aslında inplace metodu içerisinde biz bir değer vermemiş olsakta Default olarak False değerini alıyor biz burada True değerini vermiş olacağız.

df.rename(columns={"Spending Score (1-100)": "spending_score"}, inplace=True)
df

Sütün ismini bu şekilde değiştirmiş olduk.

Sütun Türünü Değiştirme

Biz eğitimin ilk başında sütunları ve sütun türlerini görmüştük. Bazen bu veri türleri istediğimiz gibi bir yapıda gelmiyor. Bunun için bazı düzenlemelere gidiliyor. Bunun için bizde astype metodunu kullanıyor olacağız.

df.dtypes

CustomerID                  int64
Genre                      object
Age                       float64
Annual Income (k$)        float64
Spending Score (1-100)    float64
dtype: object

Görüldüğü gibi zaten bizim istediğimiz gibi gelmemiş. Örneğin Age sütunu float veri türünde bu yanlış çünkü yaş değeri asla kesirli bir değer olamaz ancak tam sayı olur. Hemen değiştirelim.

df.Age = df.Age.astype(int)

Şimdi tekrar sorgulayalım.

df.dtypes

CustomerID                  int64
Genre                      object
Age                         int32
Annual Income (k$)        float64
Spending Score (1-100)    float64
dtype: object

Age sütun veri türünü değiştirmiş olduk böylece.

Silme İşlemleri

Şimdi dataFrame üzerinde sime işlemelerini yapabiliriz.

Sütun Silme İşlemi

Verisetimiz içinde gereksiz veya işimize yaramayan sütunları silmek isteyebiliriz bunun için drop metodunu kullanacağız. Örneğin Genre  sütununu silelim.

df.drop(['Genre'], axis=1,inplace=True)
df.head(5)

Satır Silme İşlemi

Şimdi ise veriseti içinde bulunan bazı değerleri silelim. Örneğin Age sütununda 65 büyük olan değerleri silelim.

df.drop(df.index[df['Age'] >65], inplace = True)
df.shape

(188, 4)

Bu şekilde 12 adet satır silmiş olduk.

Eğer tüm eksik verileri silmek istersek dropna  metodunu kullanacağız.

df =df.dropna()
df.shape

(171, 4)

 

Pandas giriş yazımızın sonuna gelmiş olduk. Eksik veya yanlış yerler için lütfen iletişime geçmekten çekinmeyin. Bir sonraki yazımda Pandas de; filter, concat, merge, aggregate, groupby, apply ve pivot tablolarını anlatacağım.

Post Author: Cahit ISLEYEN

Data Scientist at @embedica.ai

2 Replies to “Pandas Giriş”

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir