Python "pandas" kütüphanesine giriş

Başlamadan önce size sevgili kızımın pandas (pandalar) yorumunu sunmak istiyorum.
Ben resimde en çok kaydırağa tırmanan pandayı sevdim :)

In [1]:
from IPython.display import Image
Image(filename='pandas_enb.png')
Out[1]:

Pandas Python kullanan her veribilimcinin bilmesi haberi olması gereken bir kütüphane. Resmi [web sayfasında] (https://pandas.pydata.org/pandas-docs/stable/) pandas şu şekilde tanımlanıyor:

"pandas hızlı, esnek ve açıklayıcı veri yapıları sunan bir Python kütüphanesidir. İlişkisel ve işaretlenmiş veri ile sezgisel ve kolay bir şekilde çalışabilmek amacıyla tasarlanmıştır. Python ile gerçek dünyadaki very analizleri için temel bir yapı taşı olmayı hedeflemektedir."

"pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python"

Pandas ile birlikte gelen temel iki veri yapısı vardır.

  • Series (Seriler)
  • DataFrame (Veri çerçeveleri)
    Bu çalışmada sizlere "pandas" kullanmaya başlamak için gerekli temeli vermeyi hedefliyorum.
SERIES
In [2]:
# pandas kütüphanesini ekleyelim
# genel olarak pd diye eklemek makbüldrü
import pandas as pd

# İlk Series nesnemizi yaratalım
a_pd_series = pd.Series([1,2,3,4,5,6,7,8,9,10])

# bastıralım
print(a_pd_series)
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.PYQHXLVVQ7VESDPUVUADXEVJOBGHJPAY.gfortran-win_amd64.dll
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dll
  stacklevel=1)
0     1
1     2
2     3
3     4
4     5
5     6
6     7
7     8
8     9
9    10
dtype: int64

Gördüğünüz gibi veri tipi otomatik olarak int64 olarak atanmış durumda ve iki adet sütun mevcut. İlk sütuna indeks (index) ve ikinci sütuna da değerler (values) denilmektedir.

  • values ve index alanlarını görmek için:
In [3]:
# values
print(a_pd_series.values)
# index
print(a_pd_series.index)
[ 1  2  3  4  5  6  7  8  9 10]
RangeIndex(start=0, stop=10, step=1)
  • Serinin veri tipine ulaşmak için
In [4]:
a_pd_series.dtype
Out[4]:
dtype('int64')
  • Indekslere isim verebiliriz
In [5]:
b_pd_series = pd.Series([1,2,3,4,5],index=["bir","iki","üç","dört","beş"])
print(b_pd_series)
bir     1
iki     2
üç      3
dört    4
beş     5
dtype: int64
  • Serinin içindeki elemanlara erişmek için indeksleri köşeli parantez için de yazmamız yeterli
In [6]:
print(a_pd_series[3])
print(b_pd_series["iki"])
4
2
  • "Dictionary" veri tipini kullanarak bir seri yaratmamız mümkün
In [7]:
c_pd_series = pd.Series({"bir":1,"iki":2})
print(c_pd_series)
bir    1
iki    2
dtype: int64
  • Kesme (slicing) metotlarını seriler üzerinde kullanabiliriz.
In [8]:
print(a_pd_series[3:5]),
print("\n")
print(b_pd_series["iki":"dört"])
3    4
4    5
dtype: int64


iki     2
üç      3
dört    4
dtype: int64
  • Seri nesneleri karışık veri tiplerine sahip olabilirler.
In [9]:
d_pd_series = pd.Series(["a",3.14,42,True,1j],index=[0,1,2,3,4])
d_pd_series
Out[9]:
0       a
1    3.14
2      42
3    True
4      1j
dtype: object
DATAFRAME

"Dataframe"ler iki boyutlu matrisler olarak düşünülebilir. Başka bir bakış açısıyla bunu bir excel dosyası olarak da değerlendirmek mümkündür. Satırların indeksi sütunların ise isimleri vardır. "Dataframe" nesneleri aynı indekse sahip seri nesnelerinin yanyana gelmiş hali gibidir.

  • "numpy array" kullanarak bir "Dataframe" yaratalım
In [10]:
# numpy kütüphanesini çağıralım
import numpy as np
# Bir "dataframe oluşturalım"
a_pd_df = pd.DataFrame(np.random.random((4,3)), # 4x3 rasgele matris oluşturalım
                       index = np.arange(4), # indeks isimleri
                       columns=["A","B","C"]) # sütun isimleri
# gösterelim
a_pd_df
Out[10]:
A B C
0 0.051982 0.789600 0.992987
1 0.981735 0.180719 0.790755
2 0.990132 0.568847 0.592876
3 0.863298 0.293742 0.234868
  • Seri nesneleri kullanarak da dataframe yaratabiliriz. Farklı uzunluğa sahip iki seriyi gönderelim ve ne olduğuna bakalım
In [11]:
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)

# birleştirmek için pd concat fonksiyonunu kullanalım 
pd.concat([age_pd_series,weight_pd_series],axis=1,sort=True)
Out[11]:
yaş kilo
A 33.0 55.0
B 24.0 65.0
C 45.0 75.0
D NaN 80.0
E 18.0 NaN
In [12]:
# veya çoğunlukla yaptığımız gibi pd.DataFrame() kullanalım
pd.DataFrame({"yaş":age_pd_series,"kilo":weight_pd_series})
Out[12]:
yaş kilo
A 33.0 55.0
B 24.0 65.0
C 45.0 75.0
D NaN 80.0
E 18.0 NaN
  • İndeksi alalım
In [13]:
a_pd_df.index
Out[13]:
Int64Index([0, 1, 2, 3], dtype='int64')
  • Sütun isimlerini alalım
In [14]:
a_pd_df.columns
Out[14]:
Index(['A', 'B', 'C'], dtype='object')
DataFrame ile birlikte sıklıkla kullanılan fonksiyonlar
  • Aşağıdaki egzersizler için uzun bir DataFrame'e ihtiyacımız olacak. Bunu yaratalım öncelikle
In [15]:
long_pd = pd.DataFrame(np.random.random((1000,5)),columns=["A","B","C","D","E"])
  • Oluşturduğumuz dataframe'in ilk beş ve son beş satırını görelim
    • df.head(): İlk satırlar için önizleme
    • df.tail(): Son satırlar için önizleme
In [16]:
long_pd.head()
Out[16]:
A B C D E
0 0.730230 0.960101 0.498625 0.016676 0.882709
1 0.703216 0.298677 0.721458 0.625756 0.255041
2 0.450511 0.810662 0.747334 0.003714 0.170845
3 0.963964 0.415587 0.614759 0.506059 0.299342
4 0.351187 0.734988 0.113015 0.079547 0.061490
In [17]:
long_pd.tail()
Out[17]:
A B C D E
995 0.276451 0.708639 0.556721 0.450130 0.459805
996 0.451698 0.350967 0.789760 0.941680 0.940518
997 0.225785 0.218285 0.946320 0.807257 0.925278
998 0.599888 0.629247 0.343235 0.878151 0.252912
999 0.075811 0.970342 0.811501 0.002748 0.198497
  • We can extend the head (or tail) functions as long as we like by simple passing an integer parameter
In [18]:
long_pd.head(10)
Out[18]:
A B C D E
0 0.730230 0.960101 0.498625 0.016676 0.882709
1 0.703216 0.298677 0.721458 0.625756 0.255041
2 0.450511 0.810662 0.747334 0.003714 0.170845
3 0.963964 0.415587 0.614759 0.506059 0.299342
4 0.351187 0.734988 0.113015 0.079547 0.061490
5 0.306737 0.889680 0.513358 0.343764 0.140297
6 0.509765 0.371571 0.308959 0.367032 0.838325
7 0.911973 0.303341 0.873223 0.259326 0.667794
8 0.479407 0.731370 0.424660 0.187587 0.682451
9 0.295860 0.740501 0.989348 0.825172 0.782668
  • dataframe'in şeklini bulalım. Burada dikkat edin şekil bir fonksiyon değil özellik
    • df.shape
In [19]:
long_pd.shape
Out[19]:
(1000, 5)
  • Verinin tanımına nasıl ulaşabiliriz.
    • df.describe() fonksiyonu bize önemli istatistiksel değerler hakkında bilgi verir
In [20]:
long_pd.describe()
Out[20]:
A B C D E
count 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000
mean 0.493283 0.489385 0.497463 0.505297 0.507337
std 0.285979 0.289711 0.289627 0.283227 0.287932
min 0.004981 0.001234 0.000400 0.000102 0.000591
25% 0.252852 0.241807 0.239684 0.270879 0.257205
50% 0.473561 0.475910 0.513176 0.506019 0.500017
75% 0.738025 0.742935 0.741761 0.744417 0.762064
max 0.999427 0.999477 0.997525 0.999844 0.998138
  • Dataframe hakkında bilgi almak istersek. Kaç değer var, kaç sütun var, tipler nedir vb...
In [21]:
long_pd.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       1000 non-null   float64
 1   B       1000 non-null   float64
 2   C       1000 non-null   float64
 3   D       1000 non-null   float64
 4   E       1000 non-null   float64
dtypes: float64(5)
memory usage: 39.2 KB
  • NaN olmayan değerleri sayalım
In [22]:
long_pd.count()
Out[22]:
A    1000
B    1000
C    1000
D    1000
E    1000
dtype: int64
  • Değerlerin toplamı
In [23]:
long_pd.sum()
Out[23]:
A    493.283032
B    489.384581
C    497.463368
D    505.296639
E    507.336788
dtype: float64
  • Temel istatistiksel değerler (Mean, med, max, min)
In [24]:
(long_pd.max() - long_pd.min()) / long_pd.mean() * long_pd.median()
Out[24]:
A    0.954687
B    0.970757
C    1.028621
D    1.001172
E    0.983153
dtype: float64
  • Minimum ve maksimum değerin indeksini bulmak istersek
In [25]:
long_pd.idxmax()
Out[25]:
A    474
B    626
C    200
D    235
E    160
dtype: int64
  • df.groupy()
    • Çok faydalı bir fonksiyondur. Bir sütunu gruplayıp üzerinde bir operasyon yaptıktan sonra özet tablo oluşturabilirsiniz.
In [26]:
# Örnek bir dataframe oluşturalım
inp = {"isim":["Ali","Ayşe","Ahmet","Burcu","Cansu","Ramiz"],"cinsiyet":["E","K","K","E","E","E"],"boy":[180,160,150,170,200,190],"kilo":[80,55,60,50,110,90],"yaş":[15,40,72,65,20,27]}
df_example = pd.DataFrame(inp)
df_example
Out[26]:
isim cinsiyet boy kilo yaş
0 Ali E 180 80 15
1 Ayşe K 160 55 40
2 Ahmet K 150 60 72
3 Burcu E 170 50 65
4 Cansu E 200 110 20
5 Ramiz E 190 90 27
In [27]:
# Cinsiyet üzerinden gruplandırıp ortalamasını bulalım
df_example.groupby("cinsiyet").mean()
Out[27]:
boy kilo yaş
cinsiyet
E 185.0 82.5 31.75
K 155.0 57.5 56.00
In [28]:
# Hangi sütunların gruplandırılacağını da seçebilirsiniz.
# Burada "max" kullanalım değişiklik olsun
df_example.groupby("cinsiyet")[["boy","yaş"]].max()
Out[28]:
boy yaş
cinsiyet
E 200 65
K 160 72
  • Pivot tablosu oluşturalım
    • Pivot tablosu aşağıdaki gibi tanımlanmaktadır:
      Bir pivot tablosu bir başka tablodaki veriyi sıralama, ortalama alma ve toplama gibi işlemlerle özetler.
      A pivot table is a table that summarizes data from another table, and is made by applying an operation such as sorting, averaging, or summing to data in the first table, typically including grouping of the data (from Wikipedia)
In [29]:
# Maksimum değerleri görelim
df_example.pivot_table(index=["cinsiyet","yaş"],aggfunc="mean")
Out[29]:
boy kilo
cinsiyet yaş
E 15 180 80
20 200 110
27 190 90
65 170 50
K 40 160 55
72 150 60
Dataframe üzerinde "custom" fonksion kullanımı
In [30]:
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)

custom_df = pd.concat([age_pd_series,weight_pd_series],axis=1,sort=True)
custom_df
Out[30]:
yaş kilo
A 33.0 55.0
B 24.0 65.0
C 45.0 75.0
D NaN 80.0
E 18.0 NaN
In [31]:
# Her sütun için max-min aralığını bulalım
custom_df.apply(lambda x:x.max()-x.min())
Out[31]:
yaş     27.0
kilo    25.0
dtype: float64
In [32]:
# Her elemanın karesini alalım
custom_df.applymap(lambda x:x**2)
Out[32]:
yaş kilo
A 1089.0 3025.0
B 576.0 4225.0
C 2025.0 5625.0
D NaN 6400.0
E 324.0 NaN

apply sütunlar veya satırlar üzerinde işlem yapar. applymap elemanlar üzerinde işlem yapar.

DataFrame için dosya okuma
  • CSV dosyası okuma
In [33]:
# 2017 dünya mutluluk raporu
whp_2017 = pd.read_csv("world_happiness_report_2017.csv")
whp_2017.head()
Out[33]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
0 Norway 1 7.537 7.594445 7.479556 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027
1 Denmark 2 7.522 7.581728 7.462272 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707
2 Iceland 3 7.504 7.622030 7.385970 1.480633 1.610574 0.833552 0.627163 0.475540 0.153527 2.322715
3 Switzerland 4 7.494 7.561772 7.426227 1.564980 1.516912 0.858131 0.620071 0.290549 0.367007 2.276716
4 Finland 5 7.469 7.527542 7.410458 1.443572 1.540247 0.809158 0.617951 0.245483 0.382612 2.430182
In [34]:
whp_2017.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 155 entries, 0 to 154
Data columns (total 12 columns):
 #   Column                         Non-Null Count  Dtype  
---  ------                         --------------  -----  
 0   Country                        155 non-null    object 
 1   Happiness.Rank                 155 non-null    int64  
 2   Happiness.Score                155 non-null    float64
 3   Whisker.high                   155 non-null    float64
 4   Whisker.low                    155 non-null    float64
 5   Economy..GDP.per.Capita.       155 non-null    float64
 6   Family                         155 non-null    float64
 7   Health..Life.Expectancy.       155 non-null    float64
 8   Freedom                        155 non-null    float64
 9   Generosity                     155 non-null    float64
 10  Trust..Government.Corruption.  155 non-null    float64
 11  Dystopia.Residual              155 non-null    float64
dtypes: float64(10), int64(1), object(1)
memory usage: 14.7+ KB
In [35]:
whp_2017.describe()
Out[35]:
Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
count 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000 155.000000
mean 78.000000 5.354019 5.452326 5.255713 0.984718 1.188898 0.551341 0.408786 0.246883 0.123120 1.850238
std 44.888751 1.131230 1.118542 1.145030 0.420793 0.287263 0.237073 0.149997 0.134780 0.101661 0.500028
min 1.000000 2.693000 2.864884 2.521116 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.377914
25% 39.500000 4.505500 4.608172 4.374955 0.663371 1.042635 0.369866 0.303677 0.154106 0.057271 1.591291
50% 78.000000 5.279000 5.370032 5.193152 1.064578 1.253918 0.606042 0.437454 0.231538 0.089848 1.832910
75% 116.500000 6.101500 6.194600 6.006527 1.318027 1.414316 0.723008 0.516561 0.323762 0.153296 2.144654
max 155.000000 7.537000 7.622030 7.479556 1.870766 1.610574 0.949492 0.658249 0.838075 0.464308 3.117485
  • JSON okuma
In [36]:
hs_cards = pd.read_json("hscards.json")
hs_cards.head()
Out[36]:
id name description image class type quality race set mana attack health collectible
0 7 Garrosh Hellscream http://wow.zamimg.com/images/hearthstone/cards... warrior hero free none basic 0 NaN 30.0 True
1 8 Mind Control Take control of an enemy minion. http://wow.zamimg.com/images/hearthstone/cards... priest spell common none basic 10 NaN NaN True
2 9 Prophet Velen Double the damage and healing of your spells a... http://wow.zamimg.com/images/hearthstone/cards... priest minion legendary none expert 7 7.0 7.0 True
3 12 Mana Addict Whenever you cast a spell, gain +2 Attack this... http://wow.zamimg.com/images/hearthstone/cards... neutral minion rare none expert 2 1.0 3.0 True
4 21 Barrel Is something in this barrel? http://wow.zamimg.com/images/hearthstone/cards... neutral minion common none missions 0 NaN 2.0 False
DataFrame indeksleme
  • Bir sütunu seçme
In [37]:
whp_2017["Country"].head() # çıktıyı kısaltmak için head() kullanalım
Out[37]:
0         Norway
1        Denmark
2        Iceland
3    Switzerland
4        Finland
Name: Country, dtype: object
In [38]:
# Veya
whp_2017.Country.head()
Out[38]:
0         Norway
1        Denmark
2        Iceland
3    Switzerland
4        Finland
Name: Country, dtype: object
  • Birden fazla sütun seçme
In [39]:
whp_2017[["Country","Happiness.Score"]].head() 
Out[39]:
Country Happiness.Score
0 Norway 7.537
1 Denmark 7.522
2 Iceland 7.504
3 Switzerland 7.494
4 Finland 7.469
  • Satırları kesme
In [40]:
whp_2017[0:3]
Out[40]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
0 Norway 1 7.537 7.594445 7.479556 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027
1 Denmark 2 7.522 7.581728 7.462272 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707
2 Iceland 3 7.504 7.622030 7.385970 1.480633 1.610574 0.833552 0.627163 0.475540 0.153527 2.322715
  • Seçim için "loc" kullanımı
    • "loc" satırları (veya sütunları) seçmek için indeksteki belirli etiketleri kullanır
In [41]:
whp_2017.loc[[1,2,3],["Country","Happiness.Rank"]]
Out[41]:
Country Happiness.Rank
1 Denmark 2
2 Iceland 3
3 Switzerland 4
  • Seçim için "iloc" kullanımı
    • "iloc" sütun (veya satırların) indeksteki konumlarını kullanır
In [42]:
whp_2017.iloc[1:3,0:2]
Out[42]:
Country Happiness.Rank
1 Denmark 2
2 Iceland 3

Yukarıdaki örnekte "loc" fonksiyonun etiket aldığına iloc fonksiyonunun tamsayı aldığına dikkat ediniz

loc ve iloc hakkında daha fazla bilgi almak için aşağıdaki bağlantıya bakmanızı tavsiye ederim. https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation-how-are-they-different

DataFrame Operasyonları
  • Mantıksal seçim
    • Çoklu operasyonlar için &, | operatörleri kullanılmalıdır.
In [43]:
# Mutluluk değeri 5.5 üzeri ve 5.7 altı olan ülkelerin seçimi
whp_2017[ (whp_2017["Happiness.Score"]>5.5) & (whp_2017["Happiness.Score"]<5.7)]
Out[43]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
63 Mauritius 64 5.629 5.729862 5.528138 1.189396 1.209561 0.638007 0.491247 0.360934 0.042182 1.697584
64 Cyprus 65 5.621 5.714693 5.527307 1.355938 1.131363 0.844715 0.355112 0.271254 0.041238 1.621249
65 Estonia 66 5.611 5.688140 5.533860 1.320879 1.476671 0.695168 0.479131 0.098891 0.183249 1.357509
66 Belarus 67 5.569 5.646114 5.491885 1.156558 1.444945 0.637714 0.295400 0.155138 0.156314 1.723233
67 Libya 68 5.525 5.676954 5.373046 1.101803 1.357564 0.520169 0.465733 0.152074 0.092610 1.835011
  • Satıraları düşürmek
    • Bu operasyon dataframe'i değiştirmez. Eğer dataframe'i değiştirmek istiyorsanız inplace=True kullanın
In [44]:
# İlk iki tane hariç tüm satırları düşürelim
whp_2017.drop(range(2,whp_2017.shape[0]))
Out[44]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
0 Norway 1 7.537 7.594445 7.479556 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027
1 Denmark 2 7.522 7.581728 7.462272 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707
  • Sütunları düşürmek
    • axis=1 parametresinin eklenmesi gerekir
In [45]:
whp_2017.drop("Country",axis=1).head()
Out[45]:
Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
0 1 7.537 7.594445 7.479556 1.616463 1.533524 0.796667 0.635423 0.362012 0.315964 2.277027
1 2 7.522 7.581728 7.462272 1.482383 1.551122 0.792566 0.626007 0.355280 0.400770 2.313707
2 3 7.504 7.622030 7.385970 1.480633 1.610574 0.833552 0.627163 0.475540 0.153527 2.322715
3 4 7.494 7.561772 7.426227 1.564980 1.516912 0.858131 0.620071 0.290549 0.367007 2.276716
4 5 7.469 7.527542 7.410458 1.443572 1.540247 0.809158 0.617951 0.245483 0.382612 2.430182
  • Bir sütunu baz alarak sıralamak için
    • ascending=False yaparsanız en yüksek değerler en önce görünür
In [46]:
whp_2017.sort_values(by="Economy..GDP.per.Capita.",ascending=False).head()
Out[46]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
34 Qatar 35 6.375 6.568477 6.181523 1.870766 1.274297 0.710098 0.604131 0.330474 0.439299 1.145464
17 Luxembourg 18 6.863 6.923686 6.802314 1.741944 1.457584 0.845089 0.596628 0.283181 0.318834 1.619512
25 Singapore 26 6.572 6.636723 6.507277 1.692278 1.353814 0.949492 0.549841 0.345966 0.464308 1.216362
38 Kuwait 39 6.105 6.191957 6.018043 1.632952 1.259699 0.632106 0.496338 0.228290 0.215160 1.640425
20 United Arab Emirates 21 6.648 6.722047 6.573952 1.626343 1.266410 0.726798 0.608345 0.360942 0.324490 1.734704
  • Kullanması en zevkli fonksiyonlardan biri rank()'tir bana göre
    • Her elemanın sütundaki pozisyonunu döndürür. Aşağıdaki örnek söylediklerimi daha iyi açıklayacaktır.
In [47]:
whp_2017.rank().head()
Out[47]:
Country Happiness.Rank Happiness.Score Whisker.high Whisker.low Economy..GDP.per.Capita. Family Health..Life.Expectancy. Freedom Generosity Trust..Government.Corruption. Dystopia.Residual
0 105.0 1.0 155.0 154.0 155.0 150.0 149.0 128.0 154.0 130.0 145.0 127.0
1 38.0 2.0 154.0 153.0 154.0 138.0 153.0 125.0 151.0 127.0 152.0 131.0
2 58.0 3.0 153.0 155.0 151.0 137.0 155.0 141.0 152.0 145.0 117.0 132.0
3 133.0 4.0 152.0 152.0 153.0 149.0 147.0 150.0 150.0 107.0 148.0 126.0
4 45.0 5.0 151.0 151.0 152.0 134.0 150.0 131.0 149.0 85.0 149.0 136.0
  • Eğer iki seriyi toplarsak ne olur?
    • Aşağıdaki örnekte göreceğiniz üzere çakışan indekslerdeki veriler toplanır, diğer indeksler için NaN değerleri oluşturulur.
In [48]:
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)

age_pd_series + weight_pd_series
Out[48]:
A     88.0
B     89.0
C    120.0
D      NaN
E      NaN
dtype: float64

Pandas ile temel grafik çizimi

Pandas kütüphanesi "matplotlib" tabanlı çizdirme fonksiyonlarına sahiptir. Bunlar için hızlı bir gösterim yapalım

In [49]:
# Varsayılan plot grafiği
whp_2017.Generosity.plot();
In [50]:
# Grafikler için stil ekleyebiliriz
whp_2017.Generosity.plot(style="r.-",title="Generosity");
In [51]:
# Çoklu grafik
whp_2017[["Generosity","Happiness.Score"]].plot(title="Multi Plot Example");
In [52]:
# Alt grafiklerden oluşan çoklu grafik
whp_2017[["Generosity","Happiness.Score"]].plot(subplots=True);
In [53]:
# Histogram
whp_2017[["Generosity","Happiness.Score"]].hist();
In [54]:
# Boxplot'lar
whp_2017[["Generosity","Happiness.Score"]].boxplot();