{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 800100715151 Astronomide Veritabanları #\n", "\n", "## Ders - 04 Pandas Paketiyle Veri İşleme ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Doç. Dr. Özgür Baştürk
\n", "Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
\n", "obasturk at ankara.edu.tr
\n", "http://ozgur.astrotux.org" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bu derste neler öğreneceksiniz? #\n", "## Pandas Paketi İleri Konular ##\n", "\n", "* [Pandas Paketiyle Veriyi İşlenmek Üzere Hazırlama](#Pandas-Paketiyle-Veriyi-İşlenmek-Üzere-Hazırlama)\n", "* [Verinin Birbirine Bağlanması: Merging](#Verinin-Birbirine-Bağlanması:-Merging) \n", " * [Veri Çerçevelerini Bağlama Türleri](#Veri-Çerçevelerini-Bağlama-Türleri)\n", " * [Bire bir Bağlama](#Bire-bir-Bağlama)\n", " * [Çoktan bire Bağlama](#Çoktan-bire-Bağlama)\n", " * [Çoktan çoka Bağlama](#Çoktan-çoka-Bağlama)\n", " * [Farklı Sütunlar Üzerinden Bağlama](#Farklı-Sütunlar-Üzerinden-Bağlama)\n", " * [İndeks Üzerinden Bağlama İşlemleri](#İndeks-Üzerinden-Bağlama-İşlemleri)\n", " * [join Metodu](#join-Metodu)\n", "* [Veriçerçevesi ve Serileri Ucuca Ekleme: Concatenating](#Veriçerçevesi-ve-Serileri-Ucuca-Ekleme:-Concatenating)\n", " * [Veriçerçevelerinin Ucuca Eklenmesi](#Veriçerçevelerinin-Ucuca-Eklenmesi)\n", " * [Kesişim ve Bileşke Yöntemleriyle Ucuca Ekleme](#Kesişim-ve-Bileşke-Yöntemleriyle-Ucuca-Ekleme)\n", " * [Append Metodu](#Append-Metodu)\n", "* [Veri Çerçevelerini Birleştirme: Combining](#Veri-Çerçevelerini-Birleştirme:-Combining)\n", "* [Sütun ve Satırlarda Döndürme: Pivoting](#Sütun-ve-Satırlarda-Döndürme:-Pivoting)\n", " * [Uzun ve Geniş Tablolar: Longframe ve Wideframe](#Uzun-ve-Geniş-Tablolar:-Longframe-ve-Wideframe)\n", "* [Veri çıkarma: Removing](#Veri-çıkarma:-Removing)\n", " * [Tekrarlayan Satırların Atılması](#Tekrarlayan-Satırların-Atılması)\n", "* [Eşleştirme](#Eşleştirme)\n", " * [Eşleşenleri Değiştirme](#Eşleşenleri-Değiştirme)\n", " * [Eşleştirme Yaparak Yeni Bir Sütun Ekleme](#Eşleştirme-Yaparak-Yeni-Bir-Sütun-Ekleme)\n", " * [Eşleştirme Yaparak İndeks İsimlerini Değiştirme](#Eşleştirme-Yaparak-İndeks-İsimlerini-Değiştirme)\n", "* [Çoklu İndeksleme](#Çoklu-İndeksleme)\n", "* [Kaynaklar](#Kaynaklar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas Paketiyle Veriyi İşlenmek Üzere Hazırlama #\n", "\n", "Verileri `pandas` paketiyle işlemeye başlamadan önce, veriyi hazırlamak ve veri yapıları oluşturacak şekilde birleştirmek gerekir. Böylece daha sonra `pandas` kütüphanesi tarafından sağlanan araçlar ile manipüle edilebilirler. Veri hazırlama için farklı prosedürler aşağıda listelenmiştir. \n", "\n", "* Veriyi Yükleme \n", "* Veriyi Bir Araya Getirme
\n", " • Bağlama (ing. merging)
\n", " • Ucuca Ekleme (ing. concatenating)
\n", " • Birleştirme (ing. combining)\n", "* Veri Yapısını Yeniden Şekillendirme (ing. pivoting)\n", "* Veri Çıkarma (ing. removing)\n", "\n", "Veri yükleme için çeşitli yöntemlerle (sözlükler, listeler, numpy dizileri kullanarak) pandas serileri (`pandas.Series`) ve veriçerçeveleri (`pandas.DataFrame`) oluşturmayı Pandas'a Giriş dersimizde görmüştük. Ayrıca dosyalardan veriyi `pandas.read_csv` fonksiyonuyla okuyarak veriçerçevelerine yüklemeyi de örneklendirmiştik. Ancak, farklı kaynaklarda ve muhtemelen farklı formatlarda saklanan veriyi aldıktan sonra bir veriçerçevesinde (DataFrame'de) birleştirmek gibi hazırlık işlemlerine de ihtiyaç duyulabilir. Örneğin bir ötegezegene ve barınak yıldızına ilişkin pek çok bilgi exoplanet.eu ya da NASA Exoplanet Archive gibi kataloglardan alınabiliyor olsa da özellikle yıldıza ilişkin bilgilerin daha güncel olarak bulunabileceği Gaia veritabanı ya da tayfsal parametrelerinin bulunduğu veritabanlarından alınarak yıldıza ilişkin bazı bilgilerin güncellenmesi ya da diğer bazılarının eklenmesi istenebilir. Bu bölümde verilerin bütünleşik bir veri yapısına dönüştürülmesi için yapılması gerekli işlemler tartışılacaktır.\n", "\n", "`pandas` nesnelerinde tutulan veriler farklı şekillerde bir araya getirilebilirler:\n", "\n", "* Veriyi bağlama (ing. merging): `pandas.merge()` fonksiyonu, bir veya daha fazla anahtara bağlı olarak bir veritabanı çerçevesindeki (DataFrame'deki) satırları birbirine bağlar. SQL dilindeki $join$ metoduna benzer niteliktedir.\n", "\n", "* Veriyi ucuca ekleme (ing. concatenating): `pandas.concat()` fonksiyonu veri nesnelerini (Series ve DataFrame) bir eksen boyunca ucuca ekler.\n", "\n", "* Veriyi birleştirme (ing. combining): `pandas.DataFrame.combine_first()` fonksiyonu, başka bir yapıdan veri alarak veri yapısındaki eksik değerleri doldurmak ya da güncelleme için bağlamanızı sağlayan bir yöntemdir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Verinin Birbirine Bağlanması: Merging #\n", "\n", "SQL'e aşinalığı olanlar için [$JOIN$](https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/) işlemine karşılık gelen bu birleştirme işlemi, bir veriçerçevesindeki satırların bir veya daha fazla anahtar kullanarak bağlanmasını sağlar. `pandas` fonksiyonlarından `merge()` bu amaçla kullanılır. Örnek olarak, iki veriçerçevesi ($DataFrame$) tanımlayalım ve bunları birbirine `pandas.merge()` fonksiyonuyla bağlayalım." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gorsel Parlakliklar:\n", " id mV\n", "0 Arcturus -0.05\n", "1 Deneb 1.25\n", "2 Betelgeuse 0.42\n", "3 Spica 0.97\n", "4 Rigel 0.13\n", "5 Merak 2.37\n", "6 Vega 0.03\n", "7 Altair 0.76\n", "8 Bellatrix 1.64\n", "Paralakslar:\n", " id par\n", "0 Arcturus 88.83\n", "1 Betelgeuse 6.55\n", "2 Rigel 3.78\n", "3 Deneb 2.31\n", "4 Vega 130.23\n", "5 Fomalhaut 129.01\n", "6 Polaris 7.54\n", "Baglanmis Vericercevesi\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idmVpar
0Arcturus-0.0588.83
1Deneb1.252.31
2Betelgeuse0.426.55
3Rigel0.133.78
4Vega0.03130.23
\n", "
" ], "text/plain": [ " id mV par\n", "0 Arcturus -0.05 88.83\n", "1 Deneb 1.25 2.31\n", "2 Betelgeuse 0.42 6.55\n", "3 Rigel 0.13 3.78\n", "4 Vega 0.03 130.23" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "yldz_mV = pd.DataFrame(\\\n", " {'id':['Arcturus','Deneb','Betelgeuse','Spica','Rigel','Merak', 'Vega', 'Altair','Bellatrix'],\\\n", " 'mV': [-0.05,1.25,0.42,0.97,0.13,2.37,0.03,0.76,1.64]}) \n", "yldz_par = pd.DataFrame(\\\n", " {'id':['Arcturus','Betelgeuse','Rigel','Deneb','Vega','Fomalhaut','Polaris'],\\\n", " 'par': [88.83,6.55,3.78,2.31,130.23,129.01,7.54]}) \n", "print(\"Gorsel Parlakliklar:\")\n", "print(yldz_mV)\n", "print(\"Paralakslar:\")\n", "print(yldz_par)\n", "print(\"Baglanmis Vericercevesi\")\n", "pd.merge(yldz_mV,yldz_par)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sonuçtan da görebileceğiniz gibi, döndürülen veriçerçevesi, iki veriçerçevesinde de bulunan her iki sütunun yalnızca ortak olan yıldız adlarındaki tüm satırlarını içermektedir. Bu durumda `merge` fonksiyonunu herhangi bir sütunu belirtmeden kullandık. Çoğu zaman entegrasyonu hangi sütun üzerinden yapacağımızı belirlememiz gerekir. Bunun nasıl yapılabileceğine ilişkin seçenekleri görmeden önce iki veriçerçevesinin birbirine ne şekillerde bağlanabileceğine bakalım." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veri Çerçevelerini Bağlama Türleri ##\n", "\n", "### Bire bir Bağlama ###\n", "\n", "Yukarıda bir örneğini gördüğümüz bu bağlama türü (ing. one-to-one join) en basiti olup bağlanmak istenen iki sütunun tek bir sütuna dönüştürülmesi sırasında doğrudan bire-bir eşleşebilen ve birbirini tekrar etmeyen (ing. duplicate) satırların her iki veriçerçevesinde de bulunan sütunlardaki bilgilerinin de eklenmesiyle yeni bir veriçerçevesinin oluşmasını sağlar. \n", "\n", "Yukarıdaki örnek bu şekilde bir birleştirmedir. Her iki veriçerçevesinde de $id$ sütununda yer alan yıldız adları tektir ve birbirlerini karşılar. Daha sonra dıştan bağlama (outer join) işleminde göreceğiniz gibi her iki veriçerçevesindeki yıldızların da bulunduğu bir veriçerçevesi elde edilebilir. Ancak `pandas.merge()` fonksiyonunun doğal davranış şekli içten bağlama (inner join), bir başka deyişle \"kesişim\" almadır. Dolayısıyla yukarıdaki örnekte her iki veriçerçevesinde de bulunan yıldızlar yeni veriçerçevesine alınmıştır. \n", "\n", "Bir başka örnek için bu kez her iki veriçerçevesinde de aynı satırların bulunduğu ve yine satırların birbirini tekrar etmediği bir durumu inceleyelim." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Baglanmis Vericercevesi\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idei [derece]P [gun]psi [derece]Mp [x10^24 kg]Rp [km]rho [g/cm^3]Prot [saat]
0Merkur0.2057.088.00.0340.3302439.55.4271407.6
1Venus0.0073.4224.7177.4004.8706052.05.243-5832.5
2Dunya0.0170.0365.223.4005.9706378.05.51423.9
3Mars0.0941.9687.025.2000.6423396.03.93324.6
4Jupiter0.0491.34331.03.1001898.00071492.01.3269.9
5Saturn0.0572.510747.026.700568.00060268.00.68710.7
6Uranus0.0460.830589.097.80086.80025559.01.271-17.2
7Neptun0.0111.859800.028.300102.00024764.01.63816.1
\n", "
" ], "text/plain": [ " id e i [derece] P [gun] psi [derece] Mp [x10^24 kg] Rp [km] \\\n", "0 Merkur 0.205 7.0 88.0 0.034 0.330 2439.5 \n", "1 Venus 0.007 3.4 224.7 177.400 4.870 6052.0 \n", "2 Dunya 0.017 0.0 365.2 23.400 5.970 6378.0 \n", "3 Mars 0.094 1.9 687.0 25.200 0.642 3396.0 \n", "4 Jupiter 0.049 1.3 4331.0 3.100 1898.000 71492.0 \n", "5 Saturn 0.057 2.5 10747.0 26.700 568.000 60268.0 \n", "6 Uranus 0.046 0.8 30589.0 97.800 86.800 25559.0 \n", "7 Neptun 0.011 1.8 59800.0 28.300 102.000 24764.0 \n", "\n", " rho [g/cm^3] Prot [saat] \n", "0 5.427 1407.6 \n", "1 5.243 -5832.5 \n", "2 5.514 23.9 \n", "3 3.933 24.6 \n", "4 1.326 9.9 \n", "5 0.687 10.7 \n", "6 1.271 -17.2 \n", "7 1.638 16.1 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gezegen_yorunge = pd.DataFrame(\\\n", " {'id':['Merkur','Venus','Dunya','Mars','Jupiter','Saturn', 'Uranus', 'Neptun'],\\\n", " 'e': [0.205, 0.007, 0.017, 0.094, 0.049, 0.057, 0.046, 0.011],\\\n", " 'i [derece]': [7.0, 3.4, 0.0, 1.9, 1.3, 2.5, 0.8, 1.8],\\\n", " 'P [gun]' : [88.0, 224.7, 365.2, 687.0, 4331, 10747, 30589, 59800],\\\n", " 'psi [derece]': [0.034, 177.4, 23.4, 25.2, 3.1, 26.7, 97.8, 28.3]})\n", "gezegen_fiziksel = pd.DataFrame(\\\n", " {'id':['Merkur','Venus','Dunya','Mars','Jupiter','Saturn', 'Uranus', 'Neptun'],\\\n", " 'Mp [x10^24 kg]': [0.330, 4.87, 5.97, 0.642, 1898, 568, 86.8, 102],\\\n", " 'Rp [km]': [2439.5, 6052., 6378., 3396., 71492., 60268., 25559., 24764.],\\\n", " 'rho [g/cm^3]': [5.427, 5.243, 5.514, 3.933, 1.326, 0.687, 1.271, 1.638],\\\n", " 'Prot [saat]': [1407.6, -5832.5, 23.9, 24.6, 9.9, 10.7, -17.2, 16.1]})\n", "print(\"Baglanmis Vericercevesi\")\n", "pd.merge(gezegen_yorunge,gezegen_fiziksel, on='id')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Çoktan bire Bağlama ###\n", "\n", "Bağlanan sütunlardan birinin tekrarlanan (ing. duplicate) satırlar içerdiği bağlama türüdür (ing. many-to-one joins). Bu bağlama türüne bir örnek vermek üzere yeni bir veriçerçevesi tanımlayıp yukarıdaki çerçevelerle bağlayalım.\n", "\n", "Aşağıdaki örnekte gezegen_fiziksel veriçerçevesine gezegenlerin türünü göstermek üzere yeni eklenen $tur$ sütununda kayaç, gaz ve buz gezegenler birden fazla kez yer almaktadır. Buna mukabil gezegen_tur veriçerçevesinde bu sütun birer kez tekrarlanan türleri içermektedir." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Baglanmis Vericercevesi\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idMp [x10^24 kg]Rp [km]rho [g/cm^3]Prot [saat]turyer
0Merkur0.3302439.55.4271407.6kayacic gezegen
1Venus4.8706052.05.243-5832.5kayacic gezegen
2Dunya5.9706378.05.51423.9kayacic gezegen
3Mars0.6423396.03.93324.6kayacic gezegen
4Jupiter1898.00071492.01.3269.9gazdis gezegen
5Saturn568.00060268.00.68710.7gazdis gezegen
6Uranus86.80025559.01.271-17.2buzdis gezegen
7Neptun102.00024764.01.63816.1buzdis gezegen
\n", "
" ], "text/plain": [ " id Mp [x10^24 kg] Rp [km] rho [g/cm^3] Prot [saat] tur \\\n", "0 Merkur 0.330 2439.5 5.427 1407.6 kayac \n", "1 Venus 4.870 6052.0 5.243 -5832.5 kayac \n", "2 Dunya 5.970 6378.0 5.514 23.9 kayac \n", "3 Mars 0.642 3396.0 3.933 24.6 kayac \n", "4 Jupiter 1898.000 71492.0 1.326 9.9 gaz \n", "5 Saturn 568.000 60268.0 0.687 10.7 gaz \n", "6 Uranus 86.800 25559.0 1.271 -17.2 buz \n", "7 Neptun 102.000 24764.0 1.638 16.1 buz \n", "\n", " yer \n", "0 ic gezegen \n", "1 ic gezegen \n", "2 ic gezegen \n", "3 ic gezegen \n", "4 dis gezegen \n", "5 dis gezegen \n", "6 dis gezegen \n", "7 dis gezegen " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gezegen_fiziksel['tur'] = ['kayac', 'kayac', 'kayac', 'kayac', 'gaz', 'gaz', 'buz', 'buz']\n", "gezegen_tur = pd.DataFrame(\\\n", " {'tur' : ['kayac','gaz','buz'],\\\n", " 'yer' : ['ic gezegen','dis gezegen','dis gezegen']})\n", "print(\"Baglanmis Vericercevesi\")\n", "pd.merge(gezegen_fiziksel,gezegen_tur, on=\"tur\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Çoktan çoka Bağlama ###\n", "\n", "Bağlanan sütunlardan her ikisinde de tekrarlanan (ing. duplicate) satırların içerildiği bağlama türüdür (ing. many-to-many joins). Aşağıdaki örnekte daha önce oluşturduğumuz yldz_mV ve yldz_par_sptype veriçerçevelerine her iki tarafta da tekrarlanan satırlar içeren ve yıldızların tayf türünü gösteren $sptype$ sütunu eklenmiştir. Bu durumda yapılan birleştirme bir many-to-many join işlemidir." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gorsel Parlakliklar ve Tayf Turleri:\n", " id sptype mV\n", "0 Arcturus K1.5 III -0.05\n", "1 Deneb A2 Ia 1.25\n", "2 Betelgeuse M1 Iab 0.42\n", "3 Spica B1 V 0.97\n", "4 Rigel B8 Ia 0.13\n", "5 Merak A0 V 2.37\n", "6 Vega A0 V 0.03\n", "7 Altair A7 V 0.76\n", "8 Bellatrix B1 V 1.64\n", "Paralakslar ve Tayf Turleri:\n", " id sptype par\n", "0 Arcturus K1.5 III 88.83\n", "1 Betelgeuse M1 Iab 6.55\n", "2 Rigel B8 Ia 3.78\n", "3 Deneb A2 Ia 2.31\n", "4 Vega A0 V 130.23\n", "5 Fomalhaut A0 V 129.01\n", "6 Polaris F8 Ib 7.54\n", "ID Uzerinden Baglanmis Vericercevesi\n", " id sptype mV par\n", "0 Arcturus K1.5 III -0.05 88.83\n", "1 Deneb A2 Ia 1.25 2.31\n", "2 Betelgeuse M1 Iab 0.42 6.55\n", "3 Rigel B8 Ia 0.13 3.78\n", "4 Vega A0 V 0.03 130.23\n", "Tayf turu Uzerinden Baglanmis Vericercevesi\n", " id_x sptype mV id_y par\n", "0 Arcturus K1.5 III -0.05 Arcturus 88.83\n", "1 Deneb A2 Ia 1.25 Deneb 2.31\n", "2 Betelgeuse M1 Iab 0.42 Betelgeuse 6.55\n", "3 Rigel B8 Ia 0.13 Rigel 3.78\n", "4 Merak A0 V 2.37 Vega 130.23\n", "5 Merak A0 V 2.37 Fomalhaut 129.01\n", "6 Vega A0 V 0.03 Vega 130.23\n", "7 Vega A0 V 0.03 Fomalhaut 129.01\n" ] } ], "source": [ "yldz_mV_sptype = pd.DataFrame(\\\n", " {'id':['Arcturus','Deneb','Betelgeuse','Spica','Rigel','Merak', 'Vega', 'Altair','Bellatrix'],\\\n", " 'sptype':['K1.5 III', 'A2 Ia', 'M1 Iab', 'B1 V', 'B8 Ia','A0 V', 'A0 V', 'A7 V', 'B1 V'],\\\n", " 'mV': [-0.05,1.25,0.42,0.97,0.13,2.37,0.03,0.76,1.64]})\n", "yldz_par_sptype = pd.DataFrame(\\\n", " {'id':['Arcturus','Betelgeuse','Rigel','Deneb','Vega','Fomalhaut','Polaris'],\\\n", " 'sptype':['K1.5 III', 'M1 Iab', 'B8 Ia', 'A2 Ia', 'A0 V', 'A0 V', 'F8 Ib'],\\\n", " 'par': [88.83,6.55,3.78,2.31,130.23,129.01,7.54]})\n", "print(\"Gorsel Parlakliklar ve Tayf Turleri:\")\n", "print(yldz_mV_sptype)\n", "print(\"Paralakslar ve Tayf Turleri:\")\n", "print(yldz_par_sptype)\n", "print(\"ID Uzerinden Baglanmis Vericercevesi\")\n", "print(pd.merge(yldz_mV_sptype,yldz_par_sptype))\n", "print(\"Tayf turu Uzerinden Baglanmis Vericercevesi\")\n", "print(pd.merge(yldz_mV_sptype,yldz_par_sptype,on=\"sptype\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Farklı Sütunlar Üzerinden Bağlama ##\n", "\n", "Görüldüğü gibi her iki veri çerçevesinde ortak olan yıldızlar (Arcturus, Deneb, Betelgeuse, Rigel ve Vega) olduğu için iki veriçerçevesi birbirine $ID$ sütunu üzerinden bağlandı. Ancak biz aynı olan tayf türlerinden bağlamak istiyor da olabliirdik. Bunu `on` parametresini istenen sütun adına ($sptype$) ayarlayarak yapabiliriz. Her ne kadar bu parametre herhangi bir sütuna verilmediğinde her iki veri setinde aynı olan ilk sütunlar bağlama için seçilse de hangi sütun üzerinden bağlama yapılmak istendiğini her zaman belirtmekte, bir başka deyişle her zaman `on` parametresini hangi sütun üzerinden bağlama yapılmak isteniyorsa ona ayarlamakta fayda vardır." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tayf Turu Uzerinden Baglanmis Vericercevesi\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
id_xsptypemVid_ypar
0ArcturusK1.5 III-0.05Arcturus88.83
1DenebA2 Ia1.25Deneb2.31
2BetelgeuseM1 Iab0.42Betelgeuse6.55
3RigelB8 Ia0.13Rigel3.78
4MerakA0 V2.37Vega130.23
5MerakA0 V2.37Fomalhaut129.01
6VegaA0 V0.03Vega130.23
7VegaA0 V0.03Fomalhaut129.01
\n", "
" ], "text/plain": [ " id_x sptype mV id_y par\n", "0 Arcturus K1.5 III -0.05 Arcturus 88.83\n", "1 Deneb A2 Ia 1.25 Deneb 2.31\n", "2 Betelgeuse M1 Iab 0.42 Betelgeuse 6.55\n", "3 Rigel B8 Ia 0.13 Rigel 3.78\n", "4 Merak A0 V 2.37 Vega 130.23\n", "5 Merak A0 V 2.37 Fomalhaut 129.01\n", "6 Vega A0 V 0.03 Vega 130.23\n", "7 Vega A0 V 0.03 Fomalhaut 129.01" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"Tayf Turu Uzerinden Baglanmis Vericercevesi\")\n", "pd.merge(yldz_mV_sptype,yldz_par_sptype, on='sptype')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi her iki verçevesi tayf türü üzerinden bağlandığı zaman yıldız adları farklı olabilmekte, bu durumda da `merge` işlemiyle yeni oluşturulan veriçerçevesinde iki ayrı id sütunu oluşmaktadır (id_x ve id_y). İstendiği takdirde sondaki \"_x\" ve \"_y\" yerine istenen başka bir metin de kullanılabilir, bunun için `suffixes` parametresi istenen metinlere ayarlanır. Özet olarak $merge$ işleminin sonucu hangi kriterle bağlama yapıldığına bağlı olarak değişebilmektedir.\n", "\n", "Bununla birlikte, genellikle, bunun tersi bir problemle karşılaşılır: iki farklı veri setinde aynı bilgiyi içeren iki farklı sütun adının olması! Bu durumu gidermek için birinci ve ikinci veriçerçevesi için anahtar sütunu belirten `left_on` ve `right_on` seçeneklerinin kullanılması gerekir. Öncelikle yldz_mV_sptype veriçerçevesindeki sütun isimlerini değiştirelim." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " yildiz tayfturu V\n", "0 Arcturus K1.5 III -0.05\n", "1 Deneb A2 Ia 1.25\n", "2 Betelgeuse M1 Iab 0.42\n", "3 Spica B1 V 0.97\n", "4 Rigel B8 Ia 0.13\n", "5 Merak A0 V 2.37\n", "6 Vega A0 V 0.03\n", "7 Altair A7 V 0.76\n", "8 Bellatrix B1 V 1.64\n" ] } ], "source": [ "yldz_mV_sptype.columns = ['yildiz','tayfturu','V']\n", "print(yldz_mV_sptype)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yildiztayfturuVidsptypepar
0ArcturusK1.5 III-0.05ArcturusK1.5 III88.83
1DenebA2 Ia1.25DenebA2 Ia2.31
2BetelgeuseM1 Iab0.42BetelgeuseM1 Iab6.55
3RigelB8 Ia0.13RigelB8 Ia3.78
4VegaA0 V0.03VegaA0 V130.23
\n", "
" ], "text/plain": [ " yildiz tayfturu V id sptype par\n", "0 Arcturus K1.5 III -0.05 Arcturus K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 Deneb A2 Ia 2.31\n", "2 Betelgeuse M1 Iab 0.42 Betelgeuse M1 Iab 6.55\n", "3 Rigel B8 Ia 0.13 Rigel B8 Ia 3.78\n", "4 Vega A0 V 0.03 Vega A0 V 130.23" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype, yldz_par_sptype, left_on='yildiz', right_on='id')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yildiztayfturuVidsptypepar
0ArcturusK1.5 III-0.05ArcturusK1.5 III88.83
1DenebA2 Ia1.25DenebA2 Ia2.31
2BetelgeuseM1 Iab0.42BetelgeuseM1 Iab6.55
3RigelB8 Ia0.13RigelB8 Ia3.78
4MerakA0 V2.37VegaA0 V130.23
5MerakA0 V2.37FomalhautA0 V129.01
6VegaA0 V0.03VegaA0 V130.23
7VegaA0 V0.03FomalhautA0 V129.01
\n", "
" ], "text/plain": [ " yildiz tayfturu V id sptype par\n", "0 Arcturus K1.5 III -0.05 Arcturus K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 Deneb A2 Ia 2.31\n", "2 Betelgeuse M1 Iab 0.42 Betelgeuse M1 Iab 6.55\n", "3 Rigel B8 Ia 0.13 Rigel B8 Ia 3.78\n", "4 Merak A0 V 2.37 Vega A0 V 130.23\n", "5 Merak A0 V 2.37 Fomalhaut A0 V 129.01\n", "6 Vega A0 V 0.03 Vega A0 V 130.23\n", "7 Vega A0 V 0.03 Fomalhaut A0 V 129.01" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype, yldz_par_sptype, left_on='tayfturu', right_on='sptype')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Varsayılan olarak, `merge` fonksiyonu SQL diliyle bir \"inner join\" işlemi gerçekleştirir; bir başka deyiişle, sonuçtaki kesişen satırlar alınır. Her iki veriçerçevesinde de bulunmayan satırlar ise kaybedilir. Diğer olası seçenekler \"left join\", \"right join\" ve \"outer join\" 'dir ve `how` parametresinin uygun şekilde ayarlanmasıyla kullanılabilir. Bu seçeneklerin nasıl çalıştğını örnekleyerek anlamak için öncelikle yldz_mV_sptype veriçerçevesinin başlıklarını eski haline dönüştürelim." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptypemV
0ArcturusK1.5 III-0.05
1DenebA2 Ia1.25
2BetelgeuseM1 Iab0.42
3SpicaB1 V0.97
4RigelB8 Ia0.13
5MerakA0 V2.37
6VegaA0 V0.03
7AltairA7 V0.76
8BellatrixB1 V1.64
\n", "
" ], "text/plain": [ " id sptype mV\n", "0 Arcturus K1.5 III -0.05\n", "1 Deneb A2 Ia 1.25\n", "2 Betelgeuse M1 Iab 0.42\n", "3 Spica B1 V 0.97\n", "4 Rigel B8 Ia 0.13\n", "5 Merak A0 V 2.37\n", "6 Vega A0 V 0.03\n", "7 Altair A7 V 0.76\n", "8 Bellatrix B1 V 1.64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_mV_sptype.columns = ['id','sptype','mV']\n", "yldz_mV_sptype" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptype_xmVsptype_ypar
0ArcturusK1.5 III-0.05K1.5 III88.83
1DenebA2 Ia1.25A2 Ia2.31
2BetelgeuseM1 Iab0.42M1 Iab6.55
3RigelB8 Ia0.13B8 Ia3.78
4VegaA0 V0.03A0 V130.23
\n", "
" ], "text/plain": [ " id sptype_x mV sptype_y par\n", "0 Arcturus K1.5 III -0.05 K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 A2 Ia 2.31\n", "2 Betelgeuse M1 Iab 0.42 M1 Iab 6.55\n", "3 Rigel B8 Ia 0.13 B8 Ia 3.78\n", "4 Vega A0 V 0.03 A0 V 130.23" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, on='id')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptype_xmVsptype_ypar
0ArcturusK1.5 III-0.05K1.5 III88.83
1DenebA2 Ia1.25A2 Ia2.31
2BetelgeuseM1 Iab0.42M1 Iab6.55
3SpicaB1 V0.97NaNNaN
4RigelB8 Ia0.13B8 Ia3.78
5MerakA0 V2.37NaNNaN
6VegaA0 V0.03A0 V130.23
7AltairA7 V0.76NaNNaN
8BellatrixB1 V1.64NaNNaN
9FomalhautNaNNaNA0 V129.01
10PolarisNaNNaNF8 Ib7.54
\n", "
" ], "text/plain": [ " id sptype_x mV sptype_y par\n", "0 Arcturus K1.5 III -0.05 K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 A2 Ia 2.31\n", "2 Betelgeuse M1 Iab 0.42 M1 Iab 6.55\n", "3 Spica B1 V 0.97 NaN NaN\n", "4 Rigel B8 Ia 0.13 B8 Ia 3.78\n", "5 Merak A0 V 2.37 NaN NaN\n", "6 Vega A0 V 0.03 A0 V 130.23\n", "7 Altair A7 V 0.76 NaN NaN\n", "8 Bellatrix B1 V 1.64 NaN NaN\n", "9 Fomalhaut NaN NaN A0 V 129.01\n", "10 Polaris NaN NaN F8 Ib 7.54" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, on='id', how=\"outer\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi dıştan bağlamada ($outer$) karşılıklı gelemeyen satırlar için sol ve sağ tarafta $NaN$ değerleri oluşmuştur. outer join, özünde bir \"bileşke\" işlemidir ve her iki veriçerçevesinde ortak olmayan satırlar da alınır. Bu sırasıyla $left$ ve $right$ seçeneklerinin nasıl çalıştığı konusunda fikir verir. Özünde bu her iki seçenek de birer outer join seçeneğidir." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptype_xmVsptype_ypar
0ArcturusK1.5 III-0.05K1.5 III88.83
1DenebA2 Ia1.25A2 Ia2.31
2BetelgeuseM1 Iab0.42M1 Iab6.55
3SpicaB1 V0.97NaNNaN
4RigelB8 Ia0.13B8 Ia3.78
5MerakA0 V2.37NaNNaN
6VegaA0 V0.03A0 V130.23
7AltairA7 V0.76NaNNaN
8BellatrixB1 V1.64NaNNaN
\n", "
" ], "text/plain": [ " id sptype_x mV sptype_y par\n", "0 Arcturus K1.5 III -0.05 K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 A2 Ia 2.31\n", "2 Betelgeuse M1 Iab 0.42 M1 Iab 6.55\n", "3 Spica B1 V 0.97 NaN NaN\n", "4 Rigel B8 Ia 0.13 B8 Ia 3.78\n", "5 Merak A0 V 2.37 NaN NaN\n", "6 Vega A0 V 0.03 A0 V 130.23\n", "7 Altair A7 V 0.76 NaN NaN\n", "8 Bellatrix B1 V 1.64 NaN NaN" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, on='id', how=\"left\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi sol taraftaki (fonksiyona ilk olarak verilen) yldz_mV_sptype veriçerçevesinde bulunan tüm yıldızların bilinen parametreleri entegre çerçevede bulunurken; sağdaki (fonksiyona ikinci olarak geçirilen) yldz_par_sptype veriçerçevesindeki sütunlarda bilgisi olan sadece Vega yıldızının paralaks ve tayf türü bilgileri geçirilmiştir. Sol dış birleştirme (left outer join) kullanıldığında oluşan yeni veriçerçevesinde sol taraftaki (fonksiyona ilk sırada sağlanan) tüm satırlar bulunurken, sağ taraftaki veriçerçevesinde sadece sol taraftaki veriçerçevesinde de bulunan satırlar alınır; eşleşmeyen satırlar ise alınmaz. Ayrıca sütunların sıralamasında da öncelik sol taraftaki veriçerçevesinin sütunlarındadır. Bu durum $right$ seçeneğinde tam ters şekilde çalışır." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptype_xmVsptype_ypar
0ArcturusK1.5 III-0.05K1.5 III88.83
1BetelgeuseM1 Iab0.42M1 Iab6.55
2RigelB8 Ia0.13B8 Ia3.78
3DenebA2 Ia1.25A2 Ia2.31
4VegaA0 V0.03A0 V130.23
5FomalhautNaNNaNA0 V129.01
6PolarisNaNNaNF8 Ib7.54
\n", "
" ], "text/plain": [ " id sptype_x mV sptype_y par\n", "0 Arcturus K1.5 III -0.05 K1.5 III 88.83\n", "1 Betelgeuse M1 Iab 0.42 M1 Iab 6.55\n", "2 Rigel B8 Ia 0.13 B8 Ia 3.78\n", "3 Deneb A2 Ia 1.25 A2 Ia 2.31\n", "4 Vega A0 V 0.03 A0 V 130.23\n", "5 Fomalhaut NaN NaN A0 V 129.01\n", "6 Polaris NaN NaN F8 Ib 7.54" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, on='id', how=\"right\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Birden fazla anahtar (sütun adı) üzerinden entegrasyon amaçlandığında istenen sütunlar `on` parametresine bir liste dahilinde sağlanır." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptypemVpar
0ArcturusK1.5 III-0.0588.83
1DenebA2 Ia1.252.31
2BetelgeuseM1 Iab0.426.55
3SpicaB1 V0.97NaN
4RigelB8 Ia0.133.78
5MerakA0 V2.37NaN
6VegaA0 V0.03130.23
7AltairA7 V0.76NaN
8BellatrixB1 V1.64NaN
9FomalhautA0 VNaN129.01
10PolarisF8 IbNaN7.54
\n", "
" ], "text/plain": [ " id sptype mV par\n", "0 Arcturus K1.5 III -0.05 88.83\n", "1 Deneb A2 Ia 1.25 2.31\n", "2 Betelgeuse M1 Iab 0.42 6.55\n", "3 Spica B1 V 0.97 NaN\n", "4 Rigel B8 Ia 0.13 3.78\n", "5 Merak A0 V 2.37 NaN\n", "6 Vega A0 V 0.03 130.23\n", "7 Altair A7 V 0.76 NaN\n", "8 Bellatrix B1 V 1.64 NaN\n", "9 Fomalhaut A0 V NaN 129.01\n", "10 Polaris F8 Ib NaN 7.54" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, on=['id','sptype'], how=\"outer\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptyped
0ArcturusK1.5 III11.257458
1BetelgeuseM1 Iab152.671756
2RigelB8 Ia264.550265
3DenebA1 I432.900433
4VegaA0 V7.678722
5FomalhautA0 V7.751337
6PolarisF8 Ib132.625995
\n", "
" ], "text/plain": [ " id sptype d\n", "0 Arcturus K1.5 III 11.257458\n", "1 Betelgeuse M1 Iab 152.671756\n", "2 Rigel B8 Ia 264.550265\n", "3 Deneb A1 I 432.900433\n", "4 Vega A0 V 7.678722\n", "5 Fomalhaut A0 V 7.751337\n", "6 Polaris F8 Ib 132.625995" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_d_sptype = pd.DataFrame(\\\n", " {'id':['Arcturus','Betelgeuse','Rigel','Deneb','Vega','Fomalhaut','Polaris'],\\\n", " 'sptype':['K1.5 III', 'M1 Iab', 'B8 Ia', 'A1 I', 'A0 V', 'A0 V', 'F8 Ib'],\\\n", " 'd': 1 / (yldz_par_sptype['par']*1e-3)})\n", "yldz_d_sptype" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptypemVd
0ArcturusK1.5 III-0.0511.257458
1DenebA2 Ia1.25NaN
2BetelgeuseM1 Iab0.42152.671756
3SpicaB1 V0.97NaN
4RigelB8 Ia0.13264.550265
5MerakA0 V2.37NaN
6VegaA0 V0.037.678722
7AltairA7 V0.76NaN
8BellatrixB1 V1.64NaN
9DenebA1 INaN432.900433
10FomalhautA0 VNaN7.751337
11PolarisF8 IbNaN132.625995
\n", "
" ], "text/plain": [ " id sptype mV d\n", "0 Arcturus K1.5 III -0.05 11.257458\n", "1 Deneb A2 Ia 1.25 NaN\n", "2 Betelgeuse M1 Iab 0.42 152.671756\n", "3 Spica B1 V 0.97 NaN\n", "4 Rigel B8 Ia 0.13 264.550265\n", "5 Merak A0 V 2.37 NaN\n", "6 Vega A0 V 0.03 7.678722\n", "7 Altair A7 V 0.76 NaN\n", "8 Bellatrix B1 V 1.64 NaN\n", "9 Deneb A1 I NaN 432.900433\n", "10 Fomalhaut A0 V NaN 7.751337\n", "11 Polaris F8 Ib NaN 132.625995" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_d_sptype,on=['id','sptype'], how=\"outer\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptypemVd
0ArcturusK1.5 III-0.0511.257458
1BetelgeuseM1 Iab0.42152.671756
2RigelB8 Ia0.13264.550265
3VegaA0 V0.037.678722
\n", "
" ], "text/plain": [ " id sptype mV d\n", "0 Arcturus K1.5 III -0.05 11.257458\n", "1 Betelgeuse M1 Iab 0.42 152.671756\n", "2 Rigel B8 Ia 0.13 264.550265\n", "3 Vega A0 V 0.03 7.678722" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_d_sptype,on=['id','sptype'], how=\"inner\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## İndeks Üzerinden Bağlama İşlemleri ##\n", "\n", "Bazı durumlarda, bir veriçerçevesinin sütunları anahtar olarak düşünülmek yerine, indeksleri veriçerçevelerini birbirine bağlamak için kullanılmak istenebilir. Hangi indekslerin dikkate alınacağını belirtmek için, `left_index` veya `right_index` seçeneklerini etkinleştirmek (`True` olarak ayarlamak) gerekir. Bu durumda aynı indekse sahip satırlar birleştirilirken, `left_index` soldaki (fonksiyona ilk geçirilen) veriçerçevesinin aynı sütunlarını $x$, sağdaki veriçerçevesinin sütunlarını $y$ ile isimlendirir. Örnekte sağdaki veriçerçevesinin (yldz_par_sptype) 0-6 indeksleri arasında kayıtlar olduğundan bağlanmış veriçerçevesinde de sadece bu indeksler vardır. Soldaki veriçerçevesinin (yldz_mV_sptype) 7 ve 8. indekslerindeki $Altair$ ve $Bellatrix$ bağlanmış veriçerçevesinde yoktur." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
id_xsptype_xmVid_ysptype_ypar
0ArcturusK1.5 III-0.05ArcturusK1.5 III88.83
1DenebA2 Ia1.25BetelgeuseM1 Iab6.55
2BetelgeuseM1 Iab0.42RigelB8 Ia3.78
3SpicaB1 V0.97DenebA2 Ia2.31
4RigelB8 Ia0.13VegaA0 V130.23
5MerakA0 V2.37FomalhautA0 V129.01
6VegaA0 V0.03PolarisF8 Ib7.54
\n", "
" ], "text/plain": [ " id_x sptype_x mV id_y sptype_y par\n", "0 Arcturus K1.5 III -0.05 Arcturus K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 Betelgeuse M1 Iab 6.55\n", "2 Betelgeuse M1 Iab 0.42 Rigel B8 Ia 3.78\n", "3 Spica B1 V 0.97 Deneb A2 Ia 2.31\n", "4 Rigel B8 Ia 0.13 Vega A0 V 130.23\n", "5 Merak A0 V 2.37 Fomalhaut A0 V 129.01\n", "6 Vega A0 V 0.03 Polaris F8 Ib 7.54" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(yldz_mV_sptype,yldz_par_sptype, how=\"inner\", right_index=True, left_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### join Metodu ###\n", "\n", "DataFrame nesneleri, indeksler üzerinden bağlamak istediğinizde `merge()` fonksiyonu altyapısını kullanan ve onun işlevini genişleten `join()` metoduna sahiptir. Bu metodun kullanımını örneklemeden önce yine birinci veriçerçevesinin sütun başlıklarını farklı olacak şekilde ayarlayalım." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "yldz_mV_sptype.columns = ['yldiz','tayfturu','V']" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yldiztayfturuV
0ArcturusK1.5 III-0.05
1DenebA2 Ia1.25
2BetelgeuseM1 Iab0.42
3SpicaB1 V0.97
4RigelB8 Ia0.13
5MerakA0 V2.37
6VegaA0 V0.03
7AltairA7 V0.76
8BellatrixB1 V1.64
\n", "
" ], "text/plain": [ " yldiz tayfturu V\n", "0 Arcturus K1.5 III -0.05\n", "1 Deneb A2 Ia 1.25\n", "2 Betelgeuse M1 Iab 0.42\n", "3 Spica B1 V 0.97\n", "4 Rigel B8 Ia 0.13\n", "5 Merak A0 V 2.37\n", "6 Vega A0 V 0.03\n", "7 Altair A7 V 0.76\n", "8 Bellatrix B1 V 1.64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_mV_sptype" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idsptypepar
0ArcturusK1.5 III88.83
1BetelgeuseM1 Iab6.55
2RigelB8 Ia3.78
3DenebA2 Ia2.31
4VegaA0 V130.23
5FomalhautA0 V129.01
6PolarisF8 Ib7.54
\n", "
" ], "text/plain": [ " id sptype par\n", "0 Arcturus K1.5 III 88.83\n", "1 Betelgeuse M1 Iab 6.55\n", "2 Rigel B8 Ia 3.78\n", "3 Deneb A2 Ia 2.31\n", "4 Vega A0 V 130.23\n", "5 Fomalhaut A0 V 129.01\n", "6 Polaris F8 Ib 7.54" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_par_sptype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`join` arkaplanda `merge` fonksiyonunu kullanır ancak ondan farklı olarak veriçerçevesi ve seriler üzerinde tanımlanmış bir metot yapısındadır. Yukarıdaki gibi bir isim değişikliği yapılmaz ve her iki veriçerçevesinde de aynı sütunlar bulunursa $join$ işleminin yapıldığı tarafa göre sütunların yeniden isimlendirilmesi için `lsuffix` ve `rsuffix` parametreleri istenen metinlere ayarlanır." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yldiztayfturuVidsptypepar
0ArcturusK1.5 III-0.05ArcturusK1.5 III88.83
1DenebA2 Ia1.25BetelgeuseM1 Iab6.55
2BetelgeuseM1 Iab0.42RigelB8 Ia3.78
3SpicaB1 V0.97DenebA2 Ia2.31
4RigelB8 Ia0.13VegaA0 V130.23
5MerakA0 V2.37FomalhautA0 V129.01
6VegaA0 V0.03PolarisF8 Ib7.54
\n", "
" ], "text/plain": [ " yldiz tayfturu V id sptype par\n", "0 Arcturus K1.5 III -0.05 Arcturus K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 Betelgeuse M1 Iab 6.55\n", "2 Betelgeuse M1 Iab 0.42 Rigel B8 Ia 3.78\n", "3 Spica B1 V 0.97 Deneb A2 Ia 2.31\n", "4 Rigel B8 Ia 0.13 Vega A0 V 130.23\n", "5 Merak A0 V 2.37 Fomalhaut A0 V 129.01\n", "6 Vega A0 V 0.03 Polaris F8 Ib 7.54" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_mV_sptype.join(yldz_par_sptype, how=\"inner\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi $join$ ile yapılan bağlama indeksler üzerindendir. Bağlama yapılırken kesişim istendiğini belirtmek üzere `how` parametresi $inner$ seçeneğine ayarlanmıştır. Bu nedenle her iki veriçerçevesinde de bulunan $0,1,..,6$ numaralı indekslerdeki satırlar her iki veriçerçevesinden de alınarak bir bağlama işlemi yapılmıştır. Eğer bir önceki örnekte olduğu gibi tüm sütun isimleri farklı değil de bazıları aynı olsaydı, bağlama işlemi yaparken sol ve sağ taraftan gerekecek aynı isimli sütunları yeniden isimlendirmek için hangi metnin sırasıyla bu sütun isimlerinin sonuna ekleneceğini belirtmek için `lsuffix` ve `rsuffix` parametrelerini istenen metinlere ayarlamak gerekecekti." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
id_solsptype_solmVid_sagsptype_sagpar
0ArcturusK1.5 III-0.05ArcturusK1.5 III88.83
1DenebA2 Ia1.25BetelgeuseM1 Iab6.55
2BetelgeuseM1 Iab0.42RigelB8 Ia3.78
3SpicaB1 V0.97DenebA2 Ia2.31
4RigelB8 Ia0.13VegaA0 V130.23
5MerakA0 V2.37FomalhautA0 V129.01
6VegaA0 V0.03PolarisF8 Ib7.54
7AltairA7 V0.76NaNNaNNaN
8BellatrixB1 V1.64NaNNaNNaN
\n", "
" ], "text/plain": [ " id_sol sptype_sol mV id_sag sptype_sag par\n", "0 Arcturus K1.5 III -0.05 Arcturus K1.5 III 88.83\n", "1 Deneb A2 Ia 1.25 Betelgeuse M1 Iab 6.55\n", "2 Betelgeuse M1 Iab 0.42 Rigel B8 Ia 3.78\n", "3 Spica B1 V 0.97 Deneb A2 Ia 2.31\n", "4 Rigel B8 Ia 0.13 Vega A0 V 130.23\n", "5 Merak A0 V 2.37 Fomalhaut A0 V 129.01\n", "6 Vega A0 V 0.03 Polaris F8 Ib 7.54\n", "7 Altair A7 V 0.76 NaN NaN NaN\n", "8 Bellatrix B1 V 1.64 NaN NaN NaN" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yldz_mV_sptype.columns = ['id','sptype','mV']\n", "yldz_mV_sptype.join(yldz_par_sptype, rsuffix=\"_sag\", lsuffix=\"_sol\", how=\"outer\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ayrıca bu bağlamada dıştan bağlama (\"outer join\") (bileşke) işlemi uuygulandığından sol taraftaki veriçerçevesinin bütun satırları alınmış, sağ tarafta sol tarafla eşleşmeyen tüm satır değerleri $NaN$ olarak belirlenmiştir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Veriçerçevesi ve Serileri Ucuca Ekleme: Concatenating #\n", "\n", "Seri halinde veri saklayan diğer tüm Python nesnelerinde olduğu gibi `pandas` veriçerçeveleri ve serileri de ucuca eklenebilir. Bunun için `pandas.concatenate` fonksiyonu kullanılır.\n", "\n", "Önce serilerle örnekleyelim." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 0.258540\n", "2 0.545561\n", "3 0.873551\n", "4 0.959117\n", "5 0.967227\n", "6 0.636963\n", "7 0.074797\n", "8 0.523765\n", "dtype: float64\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "seri1 = pd.Series(np.random.rand(4), index=[1,2,3,4])\n", "seri2 = pd.Series(np.random.rand(4), index=[5,6,7,8])\n", "print(pd.concat([seri1,seri2]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`concatenate` fonksiyonu varsayılan olarak $axis = 0$ parametresiyle çalışır ve satır üzerinden ucuca ekleme yapar. `axis` parametresi $axis = 1$ ya da $axis = 'col'$ değerlerine ayarlanırsa ucuca ekleme sütun üzerinden yapılır. Sütunda ucuca ekleme sırasında oluşacak her yeni sütuna $0$'dan başlanarak $1, 2, ... $ numaralı indeksler atanır. Satırda aynı olmayan indekslere `NaN` değeri (ing. \"not a number\") verilir." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1\n", "1 0.258540 NaN\n", "2 0.545561 NaN\n", "3 0.873551 NaN\n", "4 0.959117 NaN\n", "5 NaN 0.967227\n", "6 NaN 0.636963\n", "7 NaN 0.074797\n", "8 NaN 0.523765\n" ] } ], "source": [ "print(pd.concat([seri1,seri2],axis = 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Varsayılan bu davranış şekli `join` parametresinin $inner$ değerine ayarlanmasıyla değiştirilebilir. Gerek SQL, gerekse de `pandas` 'ta inner join özünde bir kesişim işlemidir. Burada dikkat edilmesi gereken bu şekilde (içten) ucuca eklenecek iki serinin indekslerinin aynı olması gereğidir, aksi takdirde bir kesişim işlemi gerçekleşmez. Bu nedenle ilk örnek olarak iki aynı seriyi burada ucuca ekledik. " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1\n", "1 0.258540 0.258540\n", "2 0.545561 0.545561\n", "3 0.873551 0.873551\n", "4 0.959117 0.959117\n" ] } ], "source": [ "print(pd.concat([seri1,seri1],axis = 1, join='inner'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ucuca eklenen seri ya da veriçerçevelerinin ucuca eklendikleri yerleri belirlemek üzere `keys` parametresi ile hiyerarşik bir indeksleme yapılabilir." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 1 0.258540\n", " 2 0.545561\n", " 3 0.873551\n", " 4 0.959117\n", "2 5 0.967227\n", " 6 0.636963\n", " 7 0.074797\n", " 8 0.523765\n", "dtype: float64\n" ] } ], "source": [ "print(pd.concat([seri1,seri2], keys=[1,2]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dıştan birleştirmelerde ($axis = 1$, \"outer join\") bu anahtarlar sütun ismi olur. Ucuca ekleme işlemlerinde varsayılan birleştirme (join) metodu \"outer join\" olduğu için bunu ayrıca `how` parametresi üzerinden belirlemek gerekmez." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
10.258540NaN
20.545561NaN
30.873551NaN
40.959117NaN
5NaN0.967227
6NaN0.636963
7NaN0.074797
8NaN0.523765
\n", "
" ], "text/plain": [ " A B\n", "1 0.258540 NaN\n", "2 0.545561 NaN\n", "3 0.873551 NaN\n", "4 0.959117 NaN\n", "5 NaN 0.967227\n", "6 NaN 0.636963\n", "7 NaN 0.074797\n", "8 NaN 0.523765" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([seri1,seri2], axis = 1, keys=['A','B'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veriçerçevelerinin Ucuca Eklenmesi ##\n", "\n", "`concatenate` fonksiyonu seri nesnesi ($pd.Series$) üzerinde çalıştığı şekliyle veriçerçevesi ($pd.DataFrame$) nesneleri üzerinde de çalışır. Ancak veriçerçevesi en az iki boyutlu bir nesne olduğu için yapılabilecek işlemlerin karmaşıklığı da daha fazla olabilmektedir.\n", "\n", "Yine klasik bir ucuca ekleme işleminin öncelikle varsayılan modda (satırda) nasıl yapıldığına bir örnekle bakalım." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
110.5342370.6511550.525397
20.5527900.4213870.958711
30.0095960.7827280.720998
240.3071630.8788570.465398
50.2165170.7415340.319086
60.3471560.4887450.918812
\n", "
" ], "text/plain": [ " A B C\n", "1 1 0.534237 0.651155 0.525397\n", " 2 0.552790 0.421387 0.958711\n", " 3 0.009596 0.782728 0.720998\n", "2 4 0.307163 0.878857 0.465398\n", " 5 0.216517 0.741534 0.319086\n", " 6 0.347156 0.488745 0.918812" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "df1 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[1,2,3], columns=['A','B','C'])\n", "df2 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[4,5,6], columns=['A','B','C'])\n", "pd.concat([df1, df2], keys=[1,2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi ucuca eklenen iki veri setinden birincisi ($df1$) ilk üç satırda yer alırken, `keys` parametresi ile bu verisetine ikinci bir indeks olarak $1$ değeri atanmıştır. İkinci veri seti birincinin ucuna satırda eklenince, indeksleri $4,5,6$ olduğundan bir sorun çıkmamış, son üç satırda indeksleriyle birlikte yer almıştır. `keys` parametresi ile bu verisetine de ikinci bir indeks olarak $2$ değeri atanmıştır. \n", "\n", "Aynı veriçerçevelerini `axis` parametresini $1$ değerine ayarlayarak bu kez sütunda ucuca getirmeyi deneyelim." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCABC
10.5342370.6511550.525397NaNNaNNaN
20.5527900.4213870.958711NaNNaNNaN
30.0095960.7827280.720998NaNNaNNaN
4NaNNaNNaN0.3071630.8788570.465398
5NaNNaNNaN0.2165170.7415340.319086
6NaNNaNNaN0.3471560.4887450.918812
\n", "
" ], "text/plain": [ " A B C A B C\n", "1 0.534237 0.651155 0.525397 NaN NaN NaN\n", "2 0.552790 0.421387 0.958711 NaN NaN NaN\n", "3 0.009596 0.782728 0.720998 NaN NaN NaN\n", "4 NaN NaN NaN 0.307163 0.878857 0.465398\n", "5 NaN NaN NaN 0.216517 0.741534 0.319086\n", "6 NaN NaN NaN 0.347156 0.488745 0.918812" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ " pd.concat([df1, df2], axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi bu kez veriçerçeveleri sütunda ucuca getirilmiş, birinci veriçerçevesi $1,2,3$ indesklerine sahipken, ikinci veriçerçevesinin sahip olduğu $4,5,6$ indekslerine sahip olmadığı için bu indesklere `NaN` değeri gelmiş, tersi durum sütunda birincinin ucuna eklenen ikinci veriçerçevesi için de gerçekleşmiştir. Eğer bu iki veriçerçevesi tanımlanırken indeksleri de aynı tanımlanmış olsaydı nasıl bir durumla karşılaşacağımıza bakalım." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
X10.7120390.4626670.620813
20.7520580.0397920.877512
30.0807330.4313840.947864
Y10.5313890.0064700.781329
20.2269200.6412850.411877
30.5132220.8668180.983016
\n", "
" ], "text/plain": [ " A B C\n", "X 1 0.712039 0.462667 0.620813\n", " 2 0.752058 0.039792 0.877512\n", " 3 0.080733 0.431384 0.947864\n", "Y 1 0.531389 0.006470 0.781329\n", " 2 0.226920 0.641285 0.411877\n", " 3 0.513222 0.866818 0.983016" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "df1 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[1,2,3], columns=['A','B','C'])\n", "df2 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[1,2,3], columns=['A','B','C'])\n", "pd.concat([df1, df2], keys=['X','Y'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Satırda ucuca eklemede ortak sütun isimleri ve ikinci veriçerçevesindeki indeksler aynı şekilde korunarak birincinin ucuna eklenmiş ve son üç satıra gelmiştir. Bu durum aynı indekslerden ikişer tane olmasına yol açmaktadır. Bu durumdan `keys` parametresi sırasıyla $X$ ve $Y$ değerlerine atanmak suretiyle yapılan çoklu indesklemeyle kaçınabileceği gibi bu durum hiç bir şekilde istenmiyorsa kodun hata vermesi de sağlanabilir. `verify_integrity` parametresi bu durumu denetler. Birden fazla satırın aynı indekse sahip olması her zaman istenen bir durum değildir; zira veriçerçevesinin bütünlüğünü (\"integrity\") bozar. Bu parametre $True$ değerine ayarlandığında ucuca ekleme işlemi aynı indeksten iki tane oluşmasıyla sonuçlanacaksa bu engellenir ve bir hata mesajı üretilebilir." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ValueError: Indexes have overlapping values: Int64Index([1, 2, 3], dtype='int64')\n" ] } ], "source": [ "try:\n", " pd.concat([df1, df2], verify_integrity=True)\n", "except ValueError as e:\n", " print(\"ValueError:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ancak bu durumun bir sorun oluşturmayacağı değerlendiriliyorsa aynı indekse sahip istendiği sayıda satır veriçerçevesinde bulunabilir. Bu durum veriçerçevelerinin bir esnekliği olsa da indeksleme, dilimleme ve çağırma işlemlerinde bariz sorunlara yol açacağı gerekçesiyle veriçerçevesinin bütünlüğünü bozar." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
10.7120390.4626670.620813
20.7520580.0397920.877512
30.0807330.4313840.947864
10.5313890.0064700.781329
20.2269200.6412850.411877
30.5132220.8668180.983016
\n", "
" ], "text/plain": [ " A B C\n", "1 0.712039 0.462667 0.620813\n", "2 0.752058 0.039792 0.877512\n", "3 0.080733 0.431384 0.947864\n", "1 0.531389 0.006470 0.781329\n", "2 0.226920 0.641285 0.411877\n", "3 0.513222 0.866818 0.983016" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([df1, df2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aynı indeksten birden fazla oluşmasına engel olmak için bir başka çözüm indeksleri bütünüyle gözardı etmek ve indeks yönetimini `pandas` 'a bırakmaktır. Bunun için `ignore_index` parametresi $True$ değerine ayarlanır. Yukarıdaki örnekte olduğu gibi indekslerin önem taşımadığı ve zaten tamsayı olduğu durumlarda bu kolaylıkla uygulanabilir; ancak bu durumun sorun olarak değerlendirilebileceği indekslerin metinler olduğu örneklerle de karşılaşılabilir. Bir örnekle görelim:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABC
00.7120390.4626670.620813
10.7520580.0397920.877512
20.0807330.4313840.947864
30.5313890.0064700.781329
40.2269200.6412850.411877
50.5132220.8668180.983016
\n", "
" ], "text/plain": [ " A B C\n", "0 0.712039 0.462667 0.620813\n", "1 0.752058 0.039792 0.877512\n", "2 0.080733 0.431384 0.947864\n", "3 0.531389 0.006470 0.781329\n", "4 0.226920 0.641285 0.411877\n", "5 0.513222 0.866818 0.983016" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([df1, df2], ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere her iki veriçerçevesinin indeksleri göz ardı edilmiş ve 0'dan başlanarak yeni bir indeksleme yapılmıştır. \n", "\n", "Bu kez birleştirmeyi sütunda yapmayı deneyelim ve `axis` parametresini $'col'$ değerine ayarlayalım." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCABC
10.7120390.4626670.6208130.5313890.0064700.781329
20.7520580.0397920.8775120.2269200.6412850.411877
30.0807330.4313840.9478640.5132220.8668180.983016
\n", "
" ], "text/plain": [ " A B C A B C\n", "1 0.712039 0.462667 0.620813 0.531389 0.006470 0.781329\n", "2 0.752058 0.039792 0.877512 0.226920 0.641285 0.411877\n", "3 0.080733 0.431384 0.947864 0.513222 0.866818 0.983016" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([df1, df2], axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere aynı isimde sütunların varlığı da bir problem olmamakta sütunlar yanyana eklenebilmektedir. Yine istenirse bu durumdan `ignore_index` ya da çoklu indeksleme (`keys` parametresi üzerinden) yoluyla kaçınılabileceği gibi kodun hata vermesi de sağlanabilir (`verify_integrity = True`)." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345
10.7120390.4626670.6208130.5313890.0064700.781329
20.7520580.0397920.8775120.2269200.6412850.411877
30.0807330.4313840.9478640.5132220.8668180.983016
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5\n", "1 0.712039 0.462667 0.620813 0.531389 0.006470 0.781329\n", "2 0.752058 0.039792 0.877512 0.226920 0.641285 0.411877\n", "3 0.080733 0.431384 0.947864 0.513222 0.866818 0.983016" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([df1, df2], axis=1, ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kesişim ve Bileşke Yöntemleriyle Ucuca Ekleme ###\n", "\n", "Veriçerçeve ve serilerinin bağlanmasında (ing. merging) gördüğünüz `join` metodu, aynı lineer cebir işlemlerine karşılık gelecek şekilde verilerin ucuca eklenmesinde de kullanılabilmektedir. Yukarıdaki örnekte olduğu gibi aynı ismi taşıyan sütunlardaki verilerin doğrudan alta alta yazılması (bileşkesinin alınması) yerine bir kesişiminin de alınması istenebilir. Bu durumun `pandas.merge` fonksiyonundaki `join` metodununun $inner$ (kesişim) ve $outer$ (bileşke) değerlerine atanmasıyla sağlandğını hatırlıyorsunuz. Ucucua eklemede de `join` metodu bu değerlere atanarak amaçlanan şekilde işlemin yapılması sağlanabilir. Birer örnekle görelim." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ic gezegenler:\n", " e i P psi\n", "merkur 0.205 7.0 88.0 0.034\n", "venus 0.007 3.4 224.7 177.400\n", "dunya 0.017 0.0 365.2 23.400\n", "mars 0.094 1.9 687.0 25.200\n", "----------------\n", "Dıs gezegenler:\n", " e P rho\n", "jupiter 0.049 4331 1.326\n", "saturn 0.057 10747 0.687\n", "uranus 0.046 30589 1.271\n", "neptun 0.011 59800 1.638\n", "---------------------\n", "pd.concat([df1,df2]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
eiPpsirho
merkur0.2057.088.00.034NaN
venus0.0073.4224.7177.400NaN
dunya0.0170.0365.223.400NaN
mars0.0941.9687.025.200NaN
jupiter0.049NaN4331.0NaN1.326
saturn0.057NaN10747.0NaN0.687
uranus0.046NaN30589.0NaN1.271
neptun0.011NaN59800.0NaN1.638
\n", "
" ], "text/plain": [ " e i P psi rho\n", "merkur 0.205 7.0 88.0 0.034 NaN\n", "venus 0.007 3.4 224.7 177.400 NaN\n", "dunya 0.017 0.0 365.2 23.400 NaN\n", "mars 0.094 1.9 687.0 25.200 NaN\n", "jupiter 0.049 NaN 4331.0 NaN 1.326\n", "saturn 0.057 NaN 10747.0 NaN 0.687\n", "uranus 0.046 NaN 30589.0 NaN 1.271\n", "neptun 0.011 NaN 59800.0 NaN 1.638" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pd.DataFrame({'e':[0.205, 0.007, 0.017, 0.094],\n", " 'i': [7.0, 3.4, 0.0, 1.9],\n", " 'P': [88.0, 224.7, 365.2, 687.0],\n", " 'psi': [0.034, 177.4, 23.4, 25.2]},\n", " index=['merkur','venus','dunya','mars'])\n", "df2 = pd.DataFrame({'e':[0.049, 0.057, 0.046, 0.011],\n", " 'P': [4331, 10747, 30589, 59800],\n", " 'rho': [1.326, 0.687, 1.271, 1.638]},\n", " index=['jupiter','saturn','uranus','neptun'])\n", "print(\"Ic gezegenler:\")\n", "print(df1)\n", "print(\"----------------\")\n", "print(\"Dıs gezegenler:\")\n", "print(df2)\n", "print(\"---------------------\")\n", "print(\"pd.concat([df1,df2]\")\n", "pd.concat([df1,df2], sort=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere aksi söylenmediği takdirde yapılan işlem satırları altalta dizerken tüm sütunları kullanmak (outer join) ve bir satırın herhangi bir sütun için verisi yoksa onu `NaN` değerine atamaktır. Eğer ucuca ekleme sırasında sadece ortak olan sütunlar kullanılmak isteniyorsa bu davranış `join = 'inner'` ile aşılabilir." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pd.concat([df1,df2], join='inner')\n", " e P\n", "merkur 0.205 88.0\n", "venus 0.007 224.7\n", "dunya 0.017 365.2\n", "mars 0.094 687.0\n", "jupiter 0.049 4331.0\n", "saturn 0.057 10747.0\n", "uranus 0.046 30589.0\n", "neptun 0.011 59800.0\n" ] } ], "source": [ "print(\"pd.concat([df1,df2], join='inner')\")\n", "print(pd.concat([df1,df2], join='inner', sort=False))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Append Metodu ##\n", "\n", "Her ne kadar efektif bir yöntem olmadığı için çok sık kullanılmasa da veri birleştirmek için `pandas` veriçerçevesi ve serileri üzerinde tanımlı bir de `append` metodu bulunmaktadır. Bu metod da üzerine uygulandığı veri nesnesini değiştirmek yerine yeni bir veri nesnesi oluşturur. Dolayısıyla sonuç saklanmak isteniyorsa istenen isimde yeni bir veri nesnesine atanmalıdır. \n", "\n", "`pandas` geliştiricileri bu fonksiyonun kullanımını yakında kaldıracaklardır. Dolayısıyla bu fonksiyona bağlı bir kodu `pandas` 'ın yeni sürümlerinde çalıştırdığınızda hata verecektir. Bu sorunu çözmek için `append` fonksiyonunu `concat` fonksiyonuyla değiştirebilirsiniz." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C\n", "1 0.037204 0.668193 0.298381\n", "2 0.498604 0.820890 0.628466\n", "3 0.721989 0.826888 0.099106\n", "4 0.634740 0.176394 0.786933\n", "5 0.715181 0.312316 0.022135\n", "6 0.113030 0.847308 0.170298\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_11914/1850033379.py:3: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", " df3 = df1.append(df2)\n" ] } ], "source": [ "df1 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[1,2,3], columns=['A','B','C'])\n", "df2 = pd.DataFrame(np.random.rand(9).reshape(3,3), index=[4,5,6], columns=['A','B','C'])\n", "df3 = df1.append(df2)\n", "print(df3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Veri Çerçevelerini Birleştirme: Combining #\n", "\n", "Bir veriçerçevesini (ya da seriyi) diğerinin ucuna eklerken çakışan indeksleri bir kenara bırakıp, çakışmayanlar için ikinciyi birincinin sonuna eklemek üzere birinci nesnenin üzerinde `combine_first()` fonksiyonu tanımlanmıştır. Örneklerle nasıl çalıştığını anlayalım." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Seri 1:\n", "1 0.334622\n", "2 0.287997\n", "3 0.442509\n", "4 0.035221\n", "5 0.878870\n", "dtype: float64\n", "Seri 2:\n", "2 0.691325\n", "4 0.059857\n", "5 0.174543\n", "6 0.128802\n", "dtype: float64\n", "seri1.combine_first(seri2)\n" ] }, { "data": { "text/plain": [ "1 0.334622\n", "2 0.287997\n", "3 0.442509\n", "4 0.035221\n", "5 0.878870\n", "6 0.128802\n", "dtype: float64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "seri1 = pd.Series(np.random.rand(5),index=[1,2,3,4,5])\n", "print(\"Seri 1:\")\n", "print(seri1)\n", "seri2 = pd.Series(np.random.rand(4),index=[2,4,5,6])\n", "print(\"Seri 2:\")\n", "print(seri2)\n", "print(\"seri1.combine_first(seri2)\")\n", "seri1.combine_first(seri2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi $1, 2, 3, 4, 5$ indeksleri birinci seriden ($seri1$), $6$ indeksi ise ikinci seriden ($seri2$) alınarak seriler kombine edilmiştir. Bunun tersine bakalım." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "seri2.combine_first(seri1)\n" ] }, { "data": { "text/plain": [ "1 0.334622\n", "2 0.691325\n", "3 0.442509\n", "4 0.059857\n", "5 0.174543\n", "6 0.128802\n", "dtype: float64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"seri2.combine_first(seri1)\")\n", "seri2.combine_first(seri1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere $2, 4, 5, 6$ indeksleri ikinci seriden alınırken, onda bulunmayan $1$ ve $3$ indeksleri ise birinci seriden alınmıştır. Serilerin belirli bölümleri de dilimleme yoluyla birleştirilebilir. Aşağıdaki örnekte ilk serinin son üç elemanına kadar olan bölümünün ikinci serinin son üç elemanına kadar olan bölümünü \"overlap\" etmesi, sonrasında serinin geri kalanının $seri2$ elemanları tarafından doldurulması istenmiştir." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 0.334622\n", "2 0.287997\n", "3 0.442509\n", "4 0.059857\n", "5 0.174543\n", "dtype: float64\n" ] } ], "source": [ "print(seri1[:3].combine_first(seri2[:3]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sütun ve Satırlarda Döndürme: Pivoting #\n", "\n", "Veriyi analize hazırlarken sıklıkla başvurulan bir grup başka işlem de sütunlarla satırların yerlerini değiştirme (pivoting) işlemleridir. Bu işlemlerde sütunlar satırlara dönüştürülebildiği (stacking) gibi satırlar da sütunlara dönüştürülebilir (unstacking). Konuyu bir örnekle anlamaya çalışalım." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " odev vize final\n", "ogr1 65 45 70\n", "ogr2 80 74 90\n", "ogr3 44 37 62\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "df = pd.DataFrame(np.array([65,45,70,80,74,90,44,37,62]).reshape(3,3),\n", " index=['ogr1','ogr2','ogr3'],\n", " columns=['odev','vize','final'])\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Veriçerçeveleri (DataFrame) üzerinde tanımlı`stack()` metodunu kullanarak, sütunları satırlar haline dönüştürmek suretiyle birden fazla (hiyerarşik) indeksi bulunan bir seri üretilmesi mümkündür." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ogr1 odev 65\n", " vize 45\n", " final 70\n", "ogr2 odev 80\n", " vize 74\n", " final 90\n", "ogr3 odev 44\n", " vize 37\n", " final 62\n", "dtype: int64" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.stack()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "61.5" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ogrs = df.stack()\n", "df_ogrs['ogr1']['odev']*0.2 + df_ogrs['ogr1']['vize']*0.3 + df_ogrs['ogr1']['final']*0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bunun tersi işlem de tahmin edilebileceği gibi `unstack()` fonksiyonu ile yapılır. Örneğimizde bu işlem satırları toplayıp sütuna dönüştüreceğinden veriçerçevesinin eski halinde görüntülenmesini sağlayacaktır. Bir not olarak veriçerçevesinin değiştirilemez (immutable) bir nesne olduğunu hatırlatmakta fayda vardır. Dolayısıyla yukarıda yaptığımız işlem sadece bir görüntüleme işlemidir ve veriçerçevemiz dönüşmüş değildir. Bu noktaya dikkat çekerek tersi işlem olan `unstack()` işlemini örnekleyebilmek üzere `stack()` edilmiş veriçerçevisini bir başka veri çerçevesine aktaralım ve `unstack()` işlemini bunun sonrasında yapalım." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sutundan satira donusum (stack):\n", "ogr1 odev 65\n", " vize 45\n", " final 70\n", "ogr2 odev 80\n", " vize 74\n", " final 90\n", "ogr3 odev 44\n", " vize 37\n", " final 62\n", "dtype: int64\n", "Satirdan sutuna donusum (unstack):\n", " odev vize final\n", "ogr1 65 45 70\n", "ogr2 80 74 90\n", "ogr3 44 37 62\n" ] } ], "source": [ "df2 = df.stack()\n", "print(\"Sutundan satira donusum (stack):\")\n", "print(df2)\n", "print(\"Satirdan sutuna donusum (unstack):\")\n", "df3 = df2.unstack()\n", "print(df3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İstendiği takdirde `unstack()` fonksiyonunu tersi yönde uygulamak suretiyle orjinal veriye dönmek yerine sütun isimlerini satırlara, satırları da sütunlara veriyi doğru şekilde hizalayarak almak da tercih edilebilir. Örneğimizde bu ödev, vize ve final notlarını satırlara, öğrenci isimlerini de sütunlara almaya karşılık gelecektir." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ogr1 ogr2 ogr3\n", "odev 65 80 44\n", "vize 45 74 37\n", "final 70 90 62\n" ] } ], "source": [ "df4 = df2.unstack(0)\n", "print(df4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere bu tür işlemler, bir öğrenci için ağırlıklı ortalama almak ya da sınıf için belirli bir sınavın (örneğin vizenin) ortalamasını almak gibi işlemleri yaparken esneklik sağlar. Karşılaşılan probleme göre bu tür esneklikler sağlayan fonksiyonların farkında olunarak döngüler yerine bu fonskiyonların kullanılmlası önerilir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Uzun ve Geniş Tablolar: Longframe ve Wideframe ##\n", "\n", "Satır ve sütunların yerdeğiştirme işlemlerinden bir başkası özellikle benzer ya da aynı elemanların bulunduğu veriçerçevelerinde kullanışlı hale gelir. Okuması zor olan bir tablo türü yerine okuması ve diğer tablolarla yukarıda anlatılan yöntemlerle etkileşimi daha kolay olan bir tablo türüne geçmek tercih edilebillir." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " iyon liste dalgaboyu\n", "0 FeI NIST 5292.512\n", "1 FeI VALD 5292.509\n", "2 FeI Custom 5292.513\n", "3 NaI NIST 5682.256\n", "4 NaI VALD 5682.261\n", "5 NaI Custom 5682.258\n", "6 CaII NIST 5167.615\n", "7 CaII VALD 5167.618\n", "8 CaII Custom 5167.620\n" ] } ], "source": [ "tablo1 = pd.DataFrame({ 'iyon':['FeI','FeI','FeI',\n", " 'NaI','NaI','NaI',\n", " 'CaII','CaII','CaII'],\n", " 'liste':['NIST','VALD','Custom',\n", " 'NIST','VALD','Custom',\n", " 'NIST','VALD','Custom'],\n", " 'dalgaboyu': [5292.512, 5292.509,5292.513,\n", " 5682.256, 5682.261, 5682.258,\n", " 5167.615, 5167.618, 5167.620]})\n", "print(tablo1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Farklı iyonların farklı çizgi listelerindeki dalgaboyu değerlerini veren bu tabloyu oluşturulduğu haliyle okumak kolay olmayabilir. Ancak birden fazla indeks kullanarak bu tabloyu geniş formda gösterdiğimizde okuması çok daha kolay gelebilir. Bunun için hangi özelliğe göre döndürme işlemi yapılmak isteniyorsa `pivot()` foksiyonuna sağlanmak suretiyle istenen döndürme işlemi yapılabilir." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " dalgaboyu \n", "liste Custom NIST VALD\n", "iyon \n", "CaII 5167.620 5167.615 5167.618\n", "FeI 5292.513 5292.512 5292.509\n", "NaI 5682.258 5682.256 5682.261\n" ] } ], "source": [ "tablo2 = tablo1.pivot('iyon','liste')\n", "print(tablo2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu şekilde her bir iyonun hangi listede hangi dalgaboyunda bulunduğunu görmek çok daha kolaylaştı." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Veri çıkarma: Removing #\n", "\n", "Veri hazırlamanın son aşaması sütunların ve satırların gerektiğinde kaldırılmasıdır (removing). Buna ilişkin örnekler Ders 2: Pandas'a Giriş bölümünde görmüştük. Bununla birlikte, veriyi analize hazırlamak için gerekli işlemleri tamamlamak adına burada yeni örnekler verilecektir.\n", "\n", "Aşağıda daha önce de tanımladığımız 3 öğrencinin ödev, vize ve final notlarını gösterir veriçerçevesini tekrar tanımlayarak satır ve sütun çıkarma işlemlerini tekrarlamaya yönelik örnekler bulunmaktadır." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " odev vize final\n", "ogr1 65 45 70\n", "ogr2 80 74 90\n", "ogr3 44 37 62\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "df = pd.DataFrame(np.array([65,45,70,80,74,90,44,37,62]).reshape(3,3),\n", " index=['ogr1','ogr2','ogr3'],\n", " columns=['odev','vize','final'])\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tıpkı `numpy` dizilerinde olduğu gibi `del` komutu veriçerçevelerinden de sütun silmek için kullanılabilir. `del` sadece veriçerçeveleri üzerinde tanımlı bir metod ya da fonksiyon olmadığı için kullanılır kullanılmaz etkili olur ve başka bir veriçerçevesine ya da değişkene kopyalama gib bir önlem alınmadıysa, geri alınması mümkün değildir." ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " vize final\n", "ogr1 45 70\n", "ogr2 74 90\n", "ogr3 37 62\n" ] } ], "source": [ "del df['odev']\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İstenmeyen bir satırı kaldırmak içinse `drop()` metodu kullanılır. `drop()` veriçerçeveleri üzerinde tanımlı bir metod olduğu ve veriçerçevesi ($DataFrame$) nesnesi de değiştirilemez (immutable) olduğu için doğrudan etkili olmaz. Eğer satır silme işlemi korunmak isteniyorsa işlem sonrası oluşan veriçerçevesi bir değişkene (eskisini kaybetmek koşuluyla istenirse aynı isimli) alınmalıdır. " ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ogr3 'un olmadıgi liste:\n", " vize final\n", "ogr1 45 70\n", "ogr2 74 90\n", "orjinal liste:\n", " vize final\n", "ogr1 45 70\n", "ogr2 74 90\n", "ogr3 37 62\n" ] } ], "source": [ "df2 = df.drop('ogr3')\n", "print(\"ogr3 'un olmadıgi liste:\")\n", "print(df2)\n", "print(\"orjinal liste:\")\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tekrarlayan Satırların Atılması ##\n", "\n", "Bir `pandas` serisi ya da veriçerçevesinde tekrar eden satırları (ya da bir sütun içindeki değerleri) yakalamak için `duplicated()` metodu kullanılır. Metod, tekrarlayan değerlerin arandığı yerdeki bu tür değerleri `True` diğerlerini ise `False` olarak işaretlemek suretiyle bir şablon (mask) oluşturur. Tıpkı belirli koşullara dayalı olarak o koşulu sağlayan ve sağlamayan satırların filtrelenmesinde olduğu gibi, bu maske ilgilenilen veri setinin filtrelenmesinde kullanılabilir.\n", "\n", "Örnek olarak çeşitli tekrar eden satır ve sütunlar barındıran çizgi listesi örneğimize geri dönelim. Bu veriçerçevesinde kendini tekrar eden bir satır olmadığı için tüm satırlar $False$ olarak işaretlenecektir." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 False\n", "2 False\n", "3 False\n", "4 False\n", "5 False\n", "6 False\n", "7 False\n", "8 False\n", "dtype: bool" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "cizgi_listesi = pd.DataFrame({ 'iyon':['FeI','FeI','FeI',\n", " 'NaI','NaI','NaI',\n", " 'CaII','CaII','CaII'],\n", " 'liste':['NIST','VALD','Custom',\n", " 'NIST','VALD','Custom',\n", " 'NIST','VALD','Custom'],\n", " 'dalgaboyu': [5292.512, 5292.509,5292.513,\n", " 5682.256, 5682.261, 5682.258,\n", " 5167.615, 5167.618, 5167.620]})\n", "cizgi_listesi.duplicated()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ancak istersek herhangi bir sütunda tekrar eden değerleri de `duplicated()` fonksiyonuyla bulabiliriz." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 True\n", "2 True\n", "3 False\n", "4 True\n", "5 True\n", "6 False\n", "7 True\n", "8 True\n", "Name: iyon, dtype: bool" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cizgi_listesi['iyon'].duplicated()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu şekilde oluşturduğumuz şablonu daha sonra veriçerçevesine vererek tekrarlayan satırları alabiliriz. Örneğimizde $iyon$ sütununda her bir iyon için verilen ilk satır $False$ değeri ile maskelenmiş iken, daha sonra bu iyona ilişkin diğer çizgi listesindeki değerlerin bulunduğu satırlar $True$ olarak işaretlenmiştir. Dolayısıyla bu şablon cizgi_listesi veriçerçevesine sağlandığında sadece tekrar eden satırlar filtrelenip görüntülenir." ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyu
1FeIVALD5292.509
2FeICustom5292.513
4NaIVALD5682.261
5NaICustom5682.258
7CaIIVALD5167.618
8CaIICustom5167.620
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu\n", "1 FeI VALD 5292.509\n", "2 FeI Custom 5292.513\n", "4 NaI VALD 5682.261\n", "5 NaI Custom 5682.258\n", "7 CaII VALD 5167.618\n", "8 CaII Custom 5167.620" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cizgi_listesi[cizgi_listesi['iyon'].duplicated()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İstendiği takdirde bu tekrar satırları veriçerçevesinden çıkarılabilir. `drop_duplicates()` metodu bu amaçla kullanılır." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyu
0FeINIST5292.512
3NaINIST5682.256
6CaIINIST5167.615
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu\n", "0 FeI NIST 5292.512\n", "3 NaI NIST 5682.256\n", "6 CaII NIST 5167.615" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cizgi_listesi.drop_duplicates('iyon')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Veriçerçevesi üzerinde yaptığımız bu tür filtre işlemlerinin veriçerçevesini değiştirmediğini, işlemin sonucunu saklanması istendiğinde yeni bir veriçerçevesine alınması gerektiğini unutmayınız. Filtre işleminin sonucunun saklanması istendiğinde `inplace` parametresinin $False$ olan varsayılan değeri `True` ile değiştirilebilir. Bu durumda yapılan değişiklik kalıcı hale getirilmiş olur. [`drop_duplicates()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html) tekrarlanan satırların her seferinde sadece ilkinin ($'first'$) korunması yerine sonuncusunun korunmasını ($'last'$) ya da tamamının ($False$) filtrelenmesine de `keep` parametresi üzerinden olanak sağlar. " ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyu
2FeICustom5292.513
5NaICustom5682.258
8CaIICustom5167.620
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu\n", "2 FeI Custom 5292.513\n", "5 NaI Custom 5682.258\n", "8 CaII Custom 5167.620" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cizgi_listesi.drop_duplicates('iyon', keep='last')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gördüğünüz gibi sadece kullanıcının oluşturduğu \"Custom\" isimli çizgi listesindeki benzersiz (unique) satırlar kalmıştır; zira bu çizgi listesi son sıradadır. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Eşleştirme #\n", "\n", "Veriçerçeveleri üzerinde çalışırken zaman zaman belirli bir değere karşılık gelen tüm değerleri değiştirmek (ing. replace), değerleri eşleştirerek yeni bir sütun oluşturmak (ing. map) ya da indeks değerlerini istenen değerlerle değiştirmek (ing. rename) istenebilir. `pandas` tümü özünde \"eşleştirme\" (ing. mapping) olan bu işlemler için çeşitli fonksiyonlar sunar. \n", "\n", "## Eşleşenleri Değiştirme ##\n", "\n", "Bir veriçerçevesindeki değerlerden bazılarını istenen başka bir değerle değiştirmek için veri nesneleri üzerinde tanımlı [`replace()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.replace.html) metodu kullanılır. Değiştirilmek istenen değeri anahtar (key) yerine koymak istenen değeri değer (value kabul eden bir sözlük kullanmak bu tür değişimler için ideal bir çözümdür. \n", "\n", "Aşağıdaki örnekle bu tür işlemlerin nasıl yapıldığını görelim. cizgi_listesi veriçerçevemizde kullanıcı tanımlı çizgi listesinde yer alan tüm çizgiler için $Custom$ yerine $User$ değerini koymak istiyor olalım ve bu değişimi kalıcı hale getirmek için `inplace` parametresini de $True$ değerine ayarlayalım." ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyu
0FeINIST5292.512
1FeIVALD5292.509
2FeICustom5292.513
3NaINIST5682.256
4NaIVALD5682.261
5NaICustom5682.258
6CaIINIST5167.615
7CaIIVALD5167.618
8CaIICustom5167.620
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu\n", "0 FeI NIST 5292.512\n", "1 FeI VALD 5292.509\n", "2 FeI Custom 5292.513\n", "3 NaI NIST 5682.256\n", "4 NaI VALD 5682.261\n", "5 NaI Custom 5682.258\n", "6 CaII NIST 5167.615\n", "7 CaII VALD 5167.618\n", "8 CaII Custom 5167.620" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "cizgi_listesi = pd.DataFrame({ 'iyon':['FeI','FeI','FeI',\n", " 'NaI','NaI','NaI',\n", " 'CaII','CaII','CaII'],\n", " 'liste':['NIST','VALD','Custom',\n", " 'NIST','VALD','Custom',\n", " 'NIST','VALD','Custom'],\n", " 'dalgaboyu': [5292.512, 5292.509,5292.513,\n", " 5682.256, 5682.261, 5682.258,\n", " 5167.615, 5167.618, 5167.620]})\n", "cizgi_listesi" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyu
0FeINIST5292.512
1FeIVALD5292.509
2FeIUser5292.513
3NaINIST5682.256
4NaIVALD5682.261
5NaIUser5682.258
6CaIINIST5167.615
7CaIIVALD5167.618
8CaIIUser5167.620
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu\n", "0 FeI NIST 5292.512\n", "1 FeI VALD 5292.509\n", "2 FeI User 5292.513\n", "3 NaI NIST 5682.256\n", "4 NaI VALD 5682.261\n", "5 NaI User 5682.258\n", "6 CaII NIST 5167.615\n", "7 CaII VALD 5167.618\n", "8 CaII User 5167.620" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "listeadi = {'Custom':'User'}\n", "cizgi_listesi.replace(listeadi, inplace=True)\n", "cizgi_listesi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`replace()` fonksiyonu `NaN` gibi değerleri 0'la değiştirmek için sıklıkla kullanılır. " ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 10.0\n", "1 2.3\n", "2 NaN\n", "3 -4.0\n", "4 0.6\n", "5 NaN\n", "6 7.5\n", "dtype: float64\n", "Degisiklik sonrasi:\n", "0 10.0\n", "1 2.3\n", "2 0.0\n", "3 -4.0\n", "4 0.6\n", "5 0.0\n", "6 7.5\n", "dtype: float64\n" ] } ], "source": [ "import numpy as np\n", "seri = pd.Series([10,2.3,np.nan,-4,0.6,np.nan,7.5])\n", "print(seri)\n", "seri.replace(np.nan,0, inplace=True)\n", "print(\"Degisiklik sonrasi:\")\n", "print(seri)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Eşleştirme Yaparak Yeni Bir Sütun Ekleme ##\n", "\n", "Bir sütunda verilen değerleri kullanarak yeni bir sütun eklemek de sıklıkla ihtiyaç duyulan bir yöntemdir. `pandas` veri nesneleri üzerinde tanımlı `map()` metodu kullanılarak bu amaca erişilebilir." ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyureferanslar
0FeINIST5292.512NIST ASD Team (2019)
1FeIVALD5292.509Ryabchikova (1997)
2FeIUser5292.513this study
3NaINIST5682.256NIST ASD Team (2019)
4NaIVALD5682.261Ryabchikova (1997)
5NaIUser5682.258this study
6CaIINIST5167.615NIST ASD Team (2019)
7CaIIVALD5167.618Ryabchikova (1997)
8CaIIUser5167.620this study
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu referanslar\n", "0 FeI NIST 5292.512 NIST ASD Team (2019)\n", "1 FeI VALD 5292.509 Ryabchikova (1997)\n", "2 FeI User 5292.513 this study\n", "3 NaI NIST 5682.256 NIST ASD Team (2019)\n", "4 NaI VALD 5682.261 Ryabchikova (1997)\n", "5 NaI User 5682.258 this study\n", "6 CaII NIST 5167.615 NIST ASD Team (2019)\n", "7 CaII VALD 5167.618 Ryabchikova (1997)\n", "8 CaII User 5167.620 this study" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "liste_referanslari = {'VALD':'Ryabchikova (1997)', 'NIST':'NIST ASD Team (2019)', 'User':'this study'}\n", "cizgi_listesi['referanslar'] = cizgi_listesi['liste'].map(liste_referanslari)\n", "cizgi_listesi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Eşleştirme Yaparak İndeks İsimlerini Değiştirme ##\n", "\n", "İndeks isimlerini yenileriyle değiştirmek istendiğinde de aynı yönteme başvurulabilir. Bu kez kullanılması gereken fonksiyon yine veri nesneleri üzerinde tanımlı `rename()` metodudur.\n", "\n", "Yine cizgi_listesi veriçerçevemiz üzerinde bir örnekle görelim. Yeni indekslerimizi $iyon$ sütunundaki iyon isimleriyle $liste$ sütunundaki liste isimlerini \"_\" ile birleştirerek oluşturalım." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0: 'FeI_NIST', 1: 'FeI_VALD', 2: 'FeI_User', 3: 'NaI_NIST', 4: 'NaI_VALD', 5: 'NaI_User', 6: 'CaII_NIST', 7: 'CaII_VALD', 8: 'CaII_User'}\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iyonlistedalgaboyureferanslar
FeI_NISTFeINIST5292.512NIST ASD Team (2019)
FeI_VALDFeIVALD5292.509Ryabchikova (1997)
FeI_UserFeIUser5292.513this study
NaI_NISTNaINIST5682.256NIST ASD Team (2019)
NaI_VALDNaIVALD5682.261Ryabchikova (1997)
NaI_UserNaIUser5682.258this study
CaII_NISTCaIINIST5167.615NIST ASD Team (2019)
CaII_VALDCaIIVALD5167.618Ryabchikova (1997)
CaII_UserCaIIUser5167.620this study
\n", "
" ], "text/plain": [ " iyon liste dalgaboyu referanslar\n", "FeI_NIST FeI NIST 5292.512 NIST ASD Team (2019)\n", "FeI_VALD FeI VALD 5292.509 Ryabchikova (1997)\n", "FeI_User FeI User 5292.513 this study\n", "NaI_NIST NaI NIST 5682.256 NIST ASD Team (2019)\n", "NaI_VALD NaI VALD 5682.261 Ryabchikova (1997)\n", "NaI_User NaI User 5682.258 this study\n", "CaII_NIST CaII NIST 5167.615 NIST ASD Team (2019)\n", "CaII_VALD CaII VALD 5167.618 Ryabchikova (1997)\n", "CaII_User CaII User 5167.620 this study" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yeni_indeksler = {}\n", "for i in range(len(cizgi_listesi.index)):\n", " yeni_indeksler[i] = cizgi_listesi.at[i,'iyon']+\"_\"+cizgi_listesi.at[i,'liste']\n", "print(yeni_indeksler)\n", "cizgi_listesi.rename(yeni_indeksler)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sütun isimleri de aynı şekilde değiştirilebilir. Bu kez `columns` parametresi değişiklik yapılmak istenen sütun isimlerinin bulunduğu sözlüğe ayarlanır." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ionlinelistwavelengthreference
0FeINIST5292.512NIST ASD Team (2019)
1FeIVALD5292.509Ryabchikova (1997)
2FeIUser5292.513this study
3NaINIST5682.256NIST ASD Team (2019)
4NaIVALD5682.261Ryabchikova (1997)
5NaIUser5682.258this study
6CaIINIST5167.615NIST ASD Team (2019)
7CaIIVALD5167.618Ryabchikova (1997)
8CaIIUser5167.620this study
\n", "
" ], "text/plain": [ " ion linelist wavelength reference\n", "0 FeI NIST 5292.512 NIST ASD Team (2019)\n", "1 FeI VALD 5292.509 Ryabchikova (1997)\n", "2 FeI User 5292.513 this study\n", "3 NaI NIST 5682.256 NIST ASD Team (2019)\n", "4 NaI VALD 5682.261 Ryabchikova (1997)\n", "5 NaI User 5682.258 this study\n", "6 CaII NIST 5167.615 NIST ASD Team (2019)\n", "7 CaII VALD 5167.618 Ryabchikova (1997)\n", "8 CaII User 5167.620 this study" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sutunlar = {'dalgaboyu':'wavelength',\n", " 'iyon':'ion',\n", " 'liste':'linelist',\n", " 'referanslar':'reference'}\n", "cizgi_listesi.rename(columns=sutunlar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yine aynı şekilde bu değişikliklerin kalıcı hale getirilmek istendiği durumlarda `inplace` parametresine başvurulur." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Çoklu İndeksleme\n", "\n", "Serilerde birden, veriçerçevelerinde ikiden fazla boyutun istenmesi durumunda iyi bir çözüm çoklu indeksleme (ing. Multi-indexing) kullanmaktır." ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
veri1veri2
x00.2353300.432296
10.4945510.912278
y00.4559970.371310
10.1006630.492081
\n", "
" ], "text/plain": [ " veri1 veri2\n", "x 0 0.235330 0.432296\n", " 1 0.494551 0.912278\n", "y 0 0.455997 0.371310\n", " 1 0.100663 0.492081" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.rand(4, 2),\n", "index=[['x', 'x', 'y', 'y'], [0, 1, 0, 1]],\n", "columns=['veri1', 'veri2'])\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Çoklu indeksler oluşturmak için bir başka yöntem $MultiIndex$ fonksiyonununu kullanmaktır. Demet değişkenler şeklinde tanımlanmış çoklu indeskler için aşağıdaki örnek verilebilir." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
derinlikler
HAT-P-36bT1000.0206
T800.0220
XO-3bT1000.0096
T800.0100
KELT-16bT1000.0152
T800.0170
\n", "
" ], "text/plain": [ " derinlikler\n", "HAT-P-36b T100 0.0206\n", " T80 0.0220\n", "XO-3b T100 0.0096\n", " T80 0.0100\n", "KELT-16b T100 0.0152\n", " T80 0.0170" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = [('HAT-P-36b', 'T100'), ('HAT-P-36b', \"T80\"),\n", "('XO-3b', \"T100\"), ('XO-3b', \"T80\"),\n", "('KELT-16b', \"T100\"), ('KELT-16b', \"T80\")]\n", "derinlikler = [0.0206, 0.0220,\n", "0.0096, 0.0100,\n", "0.0152, 0.0170]\n", "index = pd.MultiIndex.from_tuples(index)\n", "df = pd.DataFrame({\"derinlikler\":derinlikler}, index=index)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu durumda 2 boyutlu tablo, 2 katlı indeksleme ((x,y),(0,1)) ile 3 boyuta çıkarılmış olur. İstendiğinde \"unstack\" edilerek bu tablo tekrar 2 boyutlu bir tabloya aşağıdaki şekilde dönüştürülebiir." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
derinlikler
T100T80
HAT-P-36b0.02060.022
KELT-16b0.01520.017
XO-3b0.00960.010
\n", "
" ], "text/plain": [ " derinlikler \n", " T100 T80\n", "HAT-P-36b 0.0206 0.022\n", "KELT-16b 0.0152 0.017\n", "XO-3b 0.0096 0.010" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_2D = df.unstack()\n", "df_2D" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tekrar 3-boyuta $stack$ fonksiyonuyla dönülür." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
derinlikler
HAT-P-36bT1000.0206
T800.0220
KELT-16bT1000.0152
T800.0170
XO-3bT1000.0096
T800.0100
\n", "
" ], "text/plain": [ " derinlikler\n", "HAT-P-36b T100 0.0206\n", " T80 0.0220\n", "KELT-16b T100 0.0152\n", " T80 0.0170\n", "XO-3b T100 0.0096\n", " T80 0.0100" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_2D.stack()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu indekslere isim verilip daha da kullanışlı hale getirilebilir." ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
derinlikler
gezegenteleskop
HAT-P-36bT1000.0206
T800.0220
XO-3bT1000.0096
T800.0100
KELT-16bT1000.0152
T800.0170
\n", "
" ], "text/plain": [ " derinlikler\n", "gezegen teleskop \n", "HAT-P-36b T100 0.0206\n", " T80 0.0220\n", "XO-3b T100 0.0096\n", " T80 0.0100\n", "KELT-16b T100 0.0152\n", " T80 0.0170" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index.names = [\"gezegen\",\"teleskop\"]\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İndeksleme ve dilimleme n-boyutlu `numpy` dizilerindekine benzerdir." ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "MultiIndex([('HAT-P-36b', 'T100'),\n", " ('HAT-P-36b', 'T80'),\n", " ( 'XO-3b', 'T100'),\n", " ( 'XO-3b', 'T80'),\n", " ( 'KELT-16b', 'T100'),\n", " ( 'KELT-16b', 'T80')],\n", " names=['gezegen', 'teleskop'])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
derinlikler
teleskop
T1000.0206
T800.0220
\n", "
" ], "text/plain": [ " derinlikler\n", "teleskop \n", "T100 0.0206\n", "T80 0.0220" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[\"HAT-P-36b\"]" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "derinlikler 0.022\n", "Name: (HAT-P-36b, T80), dtype: float64" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[\"HAT-P-36b\",\"T80\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Veri Gruplama #\n", "\n", "Veri işlemenenin son aşamasını veri gruplama (ing. data aggregation) teknikleri oluşturur. Veri gruplama kavramıyla amaçlanan bir dizi veriden tek bir gruba dönüşüm yapmaktır. Örneğin $sum()$, $mean()$, $count()$, $min()$, $max()$ gibi `numpy` fonksiyonlarıyla yapılan da bir çeşit gruplamadır. Tüm bu fonksiyonlar bir grup veriyi tek bir sayıyla ifade eder. Sayısal bu tür gruplamaların yanı sıra doğal olarak, aynı türden olduğu düşünülen verilerin, tek bir grupla ifade edildiği kategorik gruplamalar da düşünülebilir. \n", "\n", "Öncelikle `pandas` 'ta bu tür sayısal gruplamaların nasıl yapıldığını ötegezegenler veritabanı üzerinden örnekleyelim. Yine [NASA Exoplanet Archive](https://exoplanetarchive.ipac.caltech.edu/) 'dan indirebileceğiniz keşifleri onaylanmış (ing. confirmed) ötegezegenler veritabanı üzerinde çalışalım." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hostnamesy_snumsy_pnumdiscoverymethoddisc_yeardisc_facilitypl_controv_flagpl_orbperpl_orbpererr1pl_orbpererr2...sy_disterr2sy_vmagsy_vmagerr1sy_vmagerr2sy_kmagsy_kmagerr1sy_kmagerr2sy_gaiamagsy_gaiamagerr1sy_gaiamagerr2
pl_name
11 Com b11 Com21Radial Velocity2007Xinglong Station0326.030000.32-0.32...-1.92384.723070.023-0.0232.2820.346-0.3464.440380.003848-0.003848
11 UMi b11 UMi11Radial Velocity2009Thueringer Landessternwarte Tautenburg0516.219973.20-3.20...-1.97655.013000.005-0.0051.9390.270-0.2704.562160.003903-0.003903
14 And b14 And11Radial Velocity2008Okayama Astrophysical Observatory0185.840000.23-0.23...-0.71405.231330.023-0.0232.3310.240-0.2404.917810.002826-0.002826
14 Her b14 Her12Radial Velocity2002W. M. Keck Observatory01773.400022.50-2.50...-0.00736.619350.023-0.0234.7140.016-0.0166.383000.000351-0.000351
16 Cyg B b16 Cyg B31Radial Velocity1996Multiple Observatories0798.500001.00-1.00...-0.01116.215000.016-0.0164.6510.016-0.0166.064280.000603-0.000603
\n", "

5 rows × 83 columns

\n", "
" ], "text/plain": [ " hostname sy_snum sy_pnum discoverymethod disc_year \\\n", "pl_name \n", "11 Com b 11 Com 2 1 Radial Velocity 2007 \n", "11 UMi b 11 UMi 1 1 Radial Velocity 2009 \n", "14 And b 14 And 1 1 Radial Velocity 2008 \n", "14 Her b 14 Her 1 2 Radial Velocity 2002 \n", "16 Cyg B b 16 Cyg B 3 1 Radial Velocity 1996 \n", "\n", " disc_facility pl_controv_flag \\\n", "pl_name \n", "11 Com b Xinglong Station 0 \n", "11 UMi b Thueringer Landessternwarte Tautenburg 0 \n", "14 And b Okayama Astrophysical Observatory 0 \n", "14 Her b W. M. Keck Observatory 0 \n", "16 Cyg B b Multiple Observatories 0 \n", "\n", " pl_orbper pl_orbpererr1 pl_orbpererr2 ... sy_disterr2 \\\n", "pl_name ... \n", "11 Com b 326.03000 0.32 -0.32 ... -1.9238 \n", "11 UMi b 516.21997 3.20 -3.20 ... -1.9765 \n", "14 And b 185.84000 0.23 -0.23 ... -0.7140 \n", "14 Her b 1773.40002 2.50 -2.50 ... -0.0073 \n", "16 Cyg B b 798.50000 1.00 -1.00 ... -0.0111 \n", "\n", " sy_vmag sy_vmagerr1 sy_vmagerr2 sy_kmag sy_kmagerr1 \\\n", "pl_name \n", "11 Com b 4.72307 0.023 -0.023 2.282 0.346 \n", "11 UMi b 5.01300 0.005 -0.005 1.939 0.270 \n", "14 And b 5.23133 0.023 -0.023 2.331 0.240 \n", "14 Her b 6.61935 0.023 -0.023 4.714 0.016 \n", "16 Cyg B b 6.21500 0.016 -0.016 4.651 0.016 \n", "\n", " sy_kmagerr2 sy_gaiamag sy_gaiamagerr1 sy_gaiamagerr2 \n", "pl_name \n", "11 Com b -0.346 4.44038 0.003848 -0.003848 \n", "11 UMi b -0.270 4.56216 0.003903 -0.003903 \n", "14 And b -0.240 4.91781 0.002826 -0.002826 \n", "14 Her b -0.016 6.38300 0.000351 -0.000351 \n", "16 Cyg B b -0.016 6.06428 0.000603 -0.000603 \n", "\n", "[5 rows x 83 columns]" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "og = pd.read_csv(\"veri/PSCompPars_2022.03.22_01.51.21.csv\", comment=\"#\", skipinitialspace=True,\n", " index_col=\"pl_name\")\n", "og.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Öncelikle geçiş yapan ötegezegenlerin yörüngelerinin dış merkezliliklerinin ortalamasını bilmek istiyor olalım." ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Otegezegenlerin ortalama dis merkezliligi: 0.07 (+0.07 , -0.06)\n" ] } ], "source": [ "print(\"Otegezegenlerin ortalama dis merkezliligi: {:.2f} (+{:.2f} , {:.2f})\".\n", " format(og['pl_orbeccen'].mean(),og['pl_orbeccenerr1'].mean(),og['pl_orbeccenerr2'].mean())) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bir başka örnek olarak istenen sütunların genel istatistikleri için değeri `NaN` olan satırları da eledikten sonra `describe()` metodunu kullanalım. " ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pl_bmassjpl_radj
count4971.0000004971.000000
mean1.3578140.488845
std12.2991340.472060
min0.0000600.026000
25%0.0120000.154000
50%0.0256000.239000
75%0.4045000.970500
max752.0000006.900000
\n", "
" ], "text/plain": [ " pl_bmassj pl_radj\n", "count 4971.000000 4971.000000\n", "mean 1.357814 0.488845\n", "std 12.299134 0.472060\n", "min 0.000060 0.026000\n", "25% 0.012000 0.154000\n", "50% 0.025600 0.239000\n", "75% 0.404500 0.970500\n", "max 752.000000 6.900000" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og[['pl_bmassj','pl_radj']].dropna().describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GroupBy Fonksiyonuyla Veri Gruplama ##\n", "\n", "Gruplama işlemi özünde üç aşamalı bir işlemdir. Öncelikle veri istenen sütundaki eş değerlere göre gruplara bölünür (ing. split), daha sonra istenen gruplama işlemi (toplama, sayma vs.) her bir gruba uygulanır (ing. apply) ve daha sonra gruplar birleştirilir (ing. combine). Programcılıkta da veritabanı yönetiminde de bir amaca ulaşmanın birden çok yöntemi vardır. Burada tarif edilen bu işlemler dizisine ayrı ayrı fonksiyonlar (koşula göle maskeleme, fonksiyona (sum, mean gibi) maskelenmiş veri nesnelerini gönderme, sonra birleştirme (merge, join ya da concat gibi fonksiyonlarla) fonksiyonları kullanılarak gerçekleştirilebilir. Bu fonksiyonların bir sıra dahilinde planlanmasıyla da amaçlanan sonuca erişilebilir. İyi programcılık, programlama dilinin sağladığı olanakların farkında olup bunları gerektiği zaman gereğince kullanmaya dayanır. `pandas` veri nesneleri üzerinde tanımlı `GroupBy` metodu bütun bu adımları sırayla gerçekleştirebilir.\n", "\n", "Örneğin ötegezegenler ($og$) veriçerçevemizi keşif yöntemine göre gruplayalım. Bunun için öncelikle veriçerçevesinin sütunlarının adlarını görüntüleyip, keşif yönteminin hangi sütun isminde yer aldığını bulmalıyız." ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['hostname', 'sy_snum', 'sy_pnum', 'discoverymethod', 'disc_year',\n", " 'disc_facility', 'pl_controv_flag', 'pl_orbper', 'pl_orbpererr1',\n", " 'pl_orbpererr2', 'pl_orbperlim', 'pl_orbsmax', 'pl_orbsmaxerr1',\n", " 'pl_orbsmaxerr2', 'pl_orbsmaxlim', 'pl_rade', 'pl_radeerr1',\n", " 'pl_radeerr2', 'pl_radelim', 'pl_radj', 'pl_radjerr1', 'pl_radjerr2',\n", " 'pl_radjlim', 'pl_bmasse', 'pl_bmasseerr1', 'pl_bmasseerr2',\n", " 'pl_bmasselim', 'pl_bmassj', 'pl_bmassjerr1', 'pl_bmassjerr2',\n", " 'pl_bmassjlim', 'pl_bmassprov', 'pl_orbeccen', 'pl_orbeccenerr1',\n", " 'pl_orbeccenerr2', 'pl_orbeccenlim', 'pl_insol', 'pl_insolerr1',\n", " 'pl_insolerr2', 'pl_insollim', 'pl_eqt', 'pl_eqterr1', 'pl_eqterr2',\n", " 'pl_eqtlim', 'ttv_flag', 'st_spectype', 'st_teff', 'st_tefferr1',\n", " 'st_tefferr2', 'st_tefflim', 'st_rad', 'st_raderr1', 'st_raderr2',\n", " 'st_radlim', 'st_mass', 'st_masserr1', 'st_masserr2', 'st_masslim',\n", " 'st_met', 'st_meterr1', 'st_meterr2', 'st_metlim', 'st_metratio',\n", " 'st_logg', 'st_loggerr1', 'st_loggerr2', 'st_logglim', 'rastr', 'ra',\n", " 'decstr', 'dec', 'sy_dist', 'sy_disterr1', 'sy_disterr2', 'sy_vmag',\n", " 'sy_vmagerr1', 'sy_vmagerr2', 'sy_kmag', 'sy_kmagerr1', 'sy_kmagerr2',\n", " 'sy_gaiamag', 'sy_gaiamagerr1', 'sy_gaiamagerr2'],\n", " dtype='object')" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi keşif yöntemi pl_discmethod başlıklı sütunda yer almaktadır." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby(\"discoverymethod\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`GroupBy` metodunun sonucu bir `DataFrameGroupBy` nesnesidir. Bu nesne ilgilenilen veriçerçevesinin özel bir görüntüsüdür. Bu nesnenin üzerine istenen işlem uygulanarak (ing. apply) gruplama işleminin ikinci aşaması da gerçekleştirilebliir." ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hostnamesy_snumsy_pnumdisc_yeardisc_facilitypl_controv_flagpl_orbperpl_orbpererr1pl_orbpererr2pl_orbperlim...sy_disterr2sy_vmagsy_vmagerr1sy_vmagerr2sy_kmagsy_kmagerr1sy_kmagerr2sy_gaiamagsy_gaiamagerr1sy_gaiamagerr2
discoverymethod
Astrometry1111111111...1000111111
Disk Kinematics1111110000...1111111111
Eclipse Timing Variations16161616161616151516...15151515141414151515
Imaging58585858585814101014...57484847565655535353
Microlensing1291291291291291299779...12512109131212111
Orbital Brightness Modulation9999999669...8999944999
Pulsar Timing7777776666...6111111111
Pulsation Timing Variations2222222222...2222222222
Radial Velocity915915915915915915915911911915...914915912911913913904904903903
Transit3845384538453845384538453843338233823843...3737384338403839384038143812381338123812
Transit Timing Variations22222222222222101022...22222222222222222222
\n", "

11 rows × 82 columns

\n", "
" ], "text/plain": [ " hostname sy_snum sy_pnum disc_year \\\n", "discoverymethod \n", "Astrometry 1 1 1 1 \n", "Disk Kinematics 1 1 1 1 \n", "Eclipse Timing Variations 16 16 16 16 \n", "Imaging 58 58 58 58 \n", "Microlensing 129 129 129 129 \n", "Orbital Brightness Modulation 9 9 9 9 \n", "Pulsar Timing 7 7 7 7 \n", "Pulsation Timing Variations 2 2 2 2 \n", "Radial Velocity 915 915 915 915 \n", "Transit 3845 3845 3845 3845 \n", "Transit Timing Variations 22 22 22 22 \n", "\n", " disc_facility pl_controv_flag pl_orbper \\\n", "discoverymethod \n", "Astrometry 1 1 1 \n", "Disk Kinematics 1 1 0 \n", "Eclipse Timing Variations 16 16 16 \n", "Imaging 58 58 14 \n", "Microlensing 129 129 9 \n", "Orbital Brightness Modulation 9 9 9 \n", "Pulsar Timing 7 7 6 \n", "Pulsation Timing Variations 2 2 2 \n", "Radial Velocity 915 915 915 \n", "Transit 3845 3845 3843 \n", "Transit Timing Variations 22 22 22 \n", "\n", " pl_orbpererr1 pl_orbpererr2 pl_orbperlim \\\n", "discoverymethod \n", "Astrometry 1 1 1 \n", "Disk Kinematics 0 0 0 \n", "Eclipse Timing Variations 15 15 16 \n", "Imaging 10 10 14 \n", "Microlensing 7 7 9 \n", "Orbital Brightness Modulation 6 6 9 \n", "Pulsar Timing 6 6 6 \n", "Pulsation Timing Variations 2 2 2 \n", "Radial Velocity 911 911 915 \n", "Transit 3382 3382 3843 \n", "Transit Timing Variations 10 10 22 \n", "\n", " ... sy_disterr2 sy_vmag sy_vmagerr1 \\\n", "discoverymethod ... \n", "Astrometry ... 1 0 0 \n", "Disk Kinematics ... 1 1 1 \n", "Eclipse Timing Variations ... 15 15 15 \n", "Imaging ... 57 48 48 \n", "Microlensing ... 125 12 10 \n", "Orbital Brightness Modulation ... 8 9 9 \n", "Pulsar Timing ... 6 1 1 \n", "Pulsation Timing Variations ... 2 2 2 \n", "Radial Velocity ... 914 915 912 \n", "Transit ... 3737 3843 3840 \n", "Transit Timing Variations ... 22 22 22 \n", "\n", " sy_vmagerr2 sy_kmag sy_kmagerr1 sy_kmagerr2 \\\n", "discoverymethod \n", "Astrometry 0 1 1 1 \n", "Disk Kinematics 1 1 1 1 \n", "Eclipse Timing Variations 15 14 14 14 \n", "Imaging 47 56 56 55 \n", "Microlensing 9 13 12 12 \n", "Orbital Brightness Modulation 9 9 4 4 \n", "Pulsar Timing 1 1 1 1 \n", "Pulsation Timing Variations 2 2 2 2 \n", "Radial Velocity 911 913 913 904 \n", "Transit 3839 3840 3814 3812 \n", "Transit Timing Variations 22 22 22 22 \n", "\n", " sy_gaiamag sy_gaiamagerr1 sy_gaiamagerr2 \n", "discoverymethod \n", "Astrometry 1 1 1 \n", "Disk Kinematics 1 1 1 \n", "Eclipse Timing Variations 15 15 15 \n", "Imaging 53 53 53 \n", "Microlensing 1 1 1 \n", "Orbital Brightness Modulation 9 9 9 \n", "Pulsar Timing 1 1 1 \n", "Pulsation Timing Variations 2 2 2 \n", "Radial Velocity 904 903 903 \n", "Transit 3813 3812 3812 \n", "Transit Timing Variations 22 22 22 \n", "\n", "[11 rows x 82 columns]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby(\"discoverymethod\").count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi aslında bir `DataFrameGroupBy` nesnesi de bir veriçerçevesi gibi kullanılabilir. Veriçerçevelerinden sütun seçilebildiği gibi bu nesneden de istenen sütunlar seçilebilir ve üzerinde istenen işlemler düşünülebliir. Örneğin daha önce elde ettiğimiz ötegezegenlerin ortalama dış merkezliliğini keşif yöntemine göre ayrı ayrı elde edebilir, karşılaştırmalar yapabilir ve bunlardan istatistiki çıkarımlara yönebiliriz." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "discoverymethod\n", "Astrometry 0.345000\n", "Disk Kinematics NaN\n", "Eclipse Timing Variations 0.152879\n", "Imaging 0.387500\n", "Microlensing 0.075000\n", "Orbital Brightness Modulation 0.000000\n", "Pulsar Timing 0.057117\n", "Pulsation Timing Variations 0.075000\n", "Radial Velocity 0.217448\n", "Transit 0.025776\n", "Transit Timing Variations 0.083486\n", "Name: pl_orbeccen, dtype: float64" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby(\"discoverymethod\")['pl_orbeccen'].mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere geçiş ($e_{ort} \\sim 0.026$), pulsar zamanlaması ($e_{ort} \\sim 0.057$), pulsasyon frekansı değişimi ($e_{ort} \\sim 0.075$), kütleçekimsel mercek yöntemi ($e_{ort} \\sim 0.075$) gibi yöntemlerde yörünge dış merkezliliği küçük gezegenler keşfedilirken; astrometri ($e_{ort} \\sim 0.345$), doğrudan görüntüleme ($e_{ort} \\sim 0.388$), dikine hız ($e_{ort} \\sim 0.217$) gibi yöntemlerde ise ortalama yörünge dış merkezliliği daha büyük olan ötegezegenler keşfedilebilmektedir. Benzer şekilde yörünge dönemlerini de görmek isteyebiliriz. Bu kez grupladıktan sonra medyan alalım." ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "discoverymethod\n", "Astrometry 246.360000\n", "Disk Kinematics NaN\n", "Eclipse Timing Variations 3661.550000\n", "Imaging 45250.000000\n", "Microlensing 2557.000000\n", "Orbital Brightness Modulation 0.811610\n", "Pulsar Timing 45.901950\n", "Pulsation Timing Variations 1005.000000\n", "Radial Velocity 325.803000\n", "Transit 8.689307\n", "Transit Timing Variations 20.308700\n", "Name: pl_orbper, dtype: float64" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby(\"discoverymethod\")['pl_orbper'].median()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Farklı tekniklerin farklı yörünge karakteristiklerine sahip ötegezegenleri keşfetmeye daha duyarlı oldukları, bu anlamda birbirlerinin keşif yanlılıklarını dengeleme kapasiteleri görülebilmektedir. Örneğin geçiş yöntemi yörünge dönemi küçük ($P_{orb,medyan} \\sim 8.69$ gün) gezegenleri keşfetmeye yanlı iken doğrudan görüntüleme tekniğinin yanlılığı tam ters yöndedir ($P_{orb,medyan} \\sim 45250$ gün). Her ne kadar doğrudan görüntüleme yöntemiyle daha az gezegen keşfediliyor olsa da geçiş yönteminin üzerinden çıkarımlar yapılmak istenen ötegezegenler popülasyonunu dengelemesi açısından önemi açıktır.\n", "\n", "`DataFrameGroupBy` nesnesi tıpkı liste (`list`), demet değişken (`tuple`), sözlük (`dictionary`) ya da numpy dizileri (`numpy.array`) gibi üzerinde iteratif işlemler uygulanabilen bir nesnedir." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Astrometry shape=(1, 83)\n", "Disk Kinematics shape=(1, 83)\n", "Eclipse Timing Variations shape=(16, 83)\n", "Imaging shape=(58, 83)\n", "Microlensing shape=(129, 83)\n", "Orbital Brightness Modulation shape=(9, 83)\n", "Pulsar Timing shape=(7, 83)\n", "Pulsation Timing Variations shape=(2, 83)\n", "Radial Velocity shape=(915, 83)\n", "Transit shape=(3845, 83)\n", "Transit Timing Variations shape=(22, 83)\n" ] } ], "source": [ "for (teknik, grup) in og.groupby('discoverymethod'):\n", " print(\"{0:30s} shape={1}\".format(teknik, grup.shape))" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Transit 3845\n", "Radial Velocity 915\n", "Microlensing 129\n", "Imaging 58\n", "Transit Timing Variations 22\n", "Eclipse Timing Variations 16\n", "Orbital Brightness Modulation 9\n", "Pulsar Timing 7\n", "Pulsation Timing Variations 2\n", "Astrometry 1\n", "Disk Kinematics 1\n", "Name: discoverymethod, dtype: int64" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og['discoverymethod'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere her bir teknikten kaçar gezegen keşfedildiği ve her gruba karşılık gelen teknikle keşfedilen gezegenlerin kaç sütunda (71) parametrelerinin bulunduğu tek tek ekrana getirilebilmektedir. Her bir tekniğin en başarıyla uygulandığı gözlemevi ve teleskoplara ilişkin istatistiki bilgi edinmek için aşağıdaki gibi bir gruplama ifadesi kullanılabilir." ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countuniquetopfreq
discoverymethod
Astrometry11Paranal Observatory1
Disk Kinematics11Atacama Large Millimeter Array (ALMA)1
Eclipse Timing Variations167Multiple Observatories7
Imaging5816Paranal Observatory17
Microlensing1295OGLE71
Orbital Brightness Modulation91Kepler9
Pulsar Timing74Arecibo Observatory3
Pulsation Timing Variations22Kepler1
Radial Velocity91527La Silla Observatory259
Transit384529Kepler2679
Transit Timing Variations224Kepler18
\n", "
" ], "text/plain": [ " count unique \\\n", "discoverymethod \n", "Astrometry 1 1 \n", "Disk Kinematics 1 1 \n", "Eclipse Timing Variations 16 7 \n", "Imaging 58 16 \n", "Microlensing 129 5 \n", "Orbital Brightness Modulation 9 1 \n", "Pulsar Timing 7 4 \n", "Pulsation Timing Variations 2 2 \n", "Radial Velocity 915 27 \n", "Transit 3845 29 \n", "Transit Timing Variations 22 4 \n", "\n", " top freq \n", "discoverymethod \n", "Astrometry Paranal Observatory 1 \n", "Disk Kinematics Atacama Large Millimeter Array (ALMA) 1 \n", "Eclipse Timing Variations Multiple Observatories 7 \n", "Imaging Paranal Observatory 17 \n", "Microlensing OGLE 71 \n", "Orbital Brightness Modulation Kepler 9 \n", "Pulsar Timing Arecibo Observatory 3 \n", "Pulsation Timing Variations Kepler 1 \n", "Radial Velocity La Silla Observatory 259 \n", "Transit Kepler 2679 \n", "Transit Timing Variations Kepler 18 " ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby('discoverymethod')['disc_facility'].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Her bir yöntemle keşif yapan gözlemevi ya da teleskopların sayısı, en çok keşif yapan gözlemevi / teleskoplar ve kaçar keşif yaptıkları gibi bilgilere `describe()` metoduyla ulaşılır. Bu istatistikler için kullanılan gözlemevi / teleskop bilgisi içeren `disc_facility` sütunu sayısal olmayan kategorik veri içerdiği gerekçesiyle elde edilen istatistiksel parametreler de ($count$, $unique$, $top$, $freq$) kategorik veriler için geçerli istatistiki parametrelerdir. Daha önceki örneklerden sayısal veri içeren sütunlar söz konusu olduğunda bu istatistiklerin de farklı olduğunu bilyorsunuz. Aşağıdaki örnekte maksimum yörünge büyüklüğü Astronomi Birimi'nde farklı keşif tekniği grupları için farklı istatistikler dahilinde sunulmaktadır. `unstack` metodu her bir istatistiği bir diğerinden ayırarak keşif gruplarına birer ikincil indeks haline getirmektedir." ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " discoverymethod \n", "count Astrometry 1.0\n", " Disk Kinematics 1.0\n", " Eclipse Timing Variations 15.0\n", " Imaging 56.0\n", " Microlensing 127.0\n", " ... \n", "max Pulsar Timing 23.0\n", " Pulsation Timing Variations 1.7\n", " Radial Velocity 23.0\n", " Transit 4.5\n", " Transit Timing Variations 4.2\n", "Length: 88, dtype: float64" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "og.groupby('discoverymethod')['pl_orbsmax'].describe().unstack()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gördüğünüz tüm bu gruplama işlemlerinde sırasıyla gruplara ayırma (ing. split), işlem yapma (ing. apply) ve birleştirme (ing. combine) işlemleri `DataFrameGroupBy` nesnneleri üzerinde tanımlı `groupby()` fonksiyonuyla sırasıyla gerçekeştirilmektedir. `DataFrameGroupBy` nesnneleri üzerinde birleştirme (combine) işleminin yanı sıra filtreleme (`filter()`), dönüştürme (`transform()`) ve fonksiyon uygulama (`apply()`) işlemleri de tanımlıdır. \n", "\n", "### aggregatge Metodu ###\n", "\n", "`DataFrameGroupBy` nesneleri üzerinde tanımlı bu işlemlerin nasıl çalıştığını anlamaya `aggregate()` metoduyla başlayalım. Bu metod istenen liste, metin (fonksiyon adı) ya da sözlük gibi bir yapıda gönderilen tüm fonksiyonları ilgili gruplara uygular. \n", "\n", "NASA Exoplanet Archive ötegezegenler veritabanındaki ötegezegenleri keşif yöntemlerine göre gruplandırıp bu kez bazı fiziksel özelliklerinin (kütle, yarıçap, yoğunluk) minimum, medyan ve maksimum değerlerine bakalım. Fonksiyonun gruplandırma dahilinde birden fazla fonksiyonu, birden fazla sütuna aynı anda uygulayabildiğine ilişkin bu örnek aşağıdaki ifadeyle verilebilir." ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pl_bmassjpl_radj
minmedianmaxminmedianmax
discoverymethod
Astrometry28.5000028.5000028.501.0601.06001.060
Disk Kinematics2.500002.500002.501.1801.18001.180
Eclipse Timing Variations1.900006.2900023.701.0701.14001.200
Imaging2.0000011.25000752.000.9201.13006.900
Microlensing0.004500.6400018.000.0991.15001.280
Orbital Brightness Modulation0.001401.250002.100.0681.19001.360
Pulsar Timing0.000060.013532.500.0300.16551.240
Pulsation Timing Variations3.200007.5000011.801.1001.13501.170
Radial Velocity0.002201.0530055.590.0811.14001.390
Transit0.000120.02000144.000.0260.21002.085
Transit Timing Variations0.000090.1035022.000.1080.28101.210
\n", "
" ], "text/plain": [ " pl_bmassj pl_radj \\\n", " min median max min median \n", "discoverymethod \n", "Astrometry 28.50000 28.50000 28.50 1.060 1.0600 \n", "Disk Kinematics 2.50000 2.50000 2.50 1.180 1.1800 \n", "Eclipse Timing Variations 1.90000 6.29000 23.70 1.070 1.1400 \n", "Imaging 2.00000 11.25000 752.00 0.920 1.1300 \n", "Microlensing 0.00450 0.64000 18.00 0.099 1.1500 \n", "Orbital Brightness Modulation 0.00140 1.25000 2.10 0.068 1.1900 \n", "Pulsar Timing 0.00006 0.01353 2.50 0.030 0.1655 \n", "Pulsation Timing Variations 3.20000 7.50000 11.80 1.100 1.1350 \n", "Radial Velocity 0.00220 1.05300 55.59 0.081 1.1400 \n", "Transit 0.00012 0.02000 144.00 0.026 0.2100 \n", "Transit Timing Variations 0.00009 0.10350 22.00 0.108 0.2810 \n", "\n", " \n", " max \n", "discoverymethod \n", "Astrometry 1.060 \n", "Disk Kinematics 1.180 \n", "Eclipse Timing Variations 1.200 \n", "Imaging 6.900 \n", "Microlensing 1.280 \n", "Orbital Brightness Modulation 1.360 \n", "Pulsar Timing 1.240 \n", "Pulsation Timing Variations 1.170 \n", "Radial Velocity 1.390 \n", "Transit 2.085 \n", "Transit Timing Variations 1.210 " ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "og.groupby('discoverymethod')[['pl_bmassj','pl_radj']].aggregate(['min', np.median, max])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### filter Metodu ###\n", "\n", "`DataFrameGroupBy` nesneleri üzerinde tanımlı `filter()` metoduyla yapılan filtreleme işlemi, grup özelliklerine göre veri atmanıza olanak sağlar. \n", "\n", "Aşağıdaki örneği inceleyelerek `filter()` metodunun nasıl çalıştığını anlamaya çalışalım." ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " kategori veri1 veri2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n" ] } ], "source": [ "import numpy as np\n", "rng = np.random.RandomState(0)\n", "df = pd.DataFrame({'kategori': ['A', 'B', 'C', 'A', 'B', 'C'],\n", " 'veri1': range(6),\n", " 'veri2': rng.randint(0, 10, 6)},\n", " columns = ['kategori', 'veri1', 'veri2'])\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Örnek olarak bu veri çerçevesinde olup ikinci veri setinde ($veri2$) standart sapması 4'ten büyük olan ölçümleri filtreleyebiliriz. Bunun için öncelikle bir filtre fonksiyonu tanımlayalım." ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " kategori veri1 veri2\n", "0 A 0 5\n", "3 A 3 3\n" ] } ], "source": [ "filtre_fonksiyonu = lambda x: x['veri2'].std() < 4\n", "print(df.groupby('kategori').filter(filtre_fonksiyonu))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi standart sapması 4'ten küçük olan tek grup A kategorisindeki ölçümlerdir. Tüm standart sapma değerlerine bakarak bunu doğrulayabiliriz. Filtre fonksiyonu (filtering function) bir grubun (burada $A$, $B$ ve $C$ kategorileri) sağlaması beklenen şartı tanımladığı için mutlaka Boolean ($True$ ya da $False$) döndüren bir fonksiyon olmaldıır. `filter` fonksiyonu bu şartı sağlayan grupları alır, sağlamayanları eler." ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " veri1 veri2\n", "kategori \n", "A 2.12132 1.414214\n", "B 2.12132 4.949747\n", "C 2.12132 4.242641\n" ] } ], "source": [ "print(df.groupby('kategori').std())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Şimdi bu örnekle öğrendiklerimizi yine ötegezegenler ($og$) veriçerçevemize uygulayarak pekiştirelim. Veriçerçevimizi gruplama için yine discoverymethod sütununda verilen keşif yöntemini kullanalım. Sonrasında filtrelemeyi keşfettiği gezegenlerin yörüngelerinin ortalama dış merkezliliği 0.25'ten büyük olan tekniklerle ($e_{ort} > 0.25$) keşfedilen gezegenleri göstermek üzere yapalım. Bu gezegenlerin de tüm sütunlardaki değerlerini değil sadece keşif yöntemi (discoverymethod), yörünge dış merkezliliği (pl_orbeccen), yörünge dönemi (pl_orbper) ve yörünge büyüklüğünü (pl_orbsmax) veren sütunları gösterelim." ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " pl_orbeccen pl_orbper pl_orbsmax\n", "discoverymethod \n", "Astrometry 0.3450 246.36 0.360000\n", "Imaging 0.3875 29968145.90 553.467857\n" ] } ], "source": [ "filtre_fonksiyonu = lambda x: x['pl_orbeccen'].mean() > 0.25\n", "print(og.groupby('discoverymethod').\\\n", "filter(filtre_fonksiyonu)[['discoverymethod','pl_orbeccen','pl_orbper','pl_orbsmax']].\\\n", "groupby('discoverymethod').mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü gibi $e_{ort} > 0.25$ koşulunu sağlayan iki yöntem doğrudan görüntüleme (ing. Imaging) ve astrometri yöntemleridir. Ekrana bu yöntemlerle keşfedilen gezegenlerin istenen parametreleri, `DataFrameGroupBy` nesnesi üzerinde tanımlı `filter()` fonksiyonunun sonucu bir veriçerçevesi türünde nesne olduğu için getirilebilmiştir.\n", "\n", "Sonuç olarak `filter()` fonksiyonu uygulandığı veriçerçevesinin bir şekilde sınırlandırılmış (kısaltılmıış) bir versiyonunu döndürür." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### trasformation Metodu ###\n", "\n", "Filtreleme verilen veri gruplarını bir filtre fonksiyonuna tabi tutup, bu filtre fonksiyonuyla belirlenen şartı sağlayanlarını alır ve gerisini filtreleyip elerken, `transformation()` metodu grubu ilgili fonksiyon çerçevesinde dönüştürür. \n", "\n", "Örneğin bir veri setindeki her bir veriden o verinin dahil olduğu grubun (örneğin $A$ kategorisinin) ortalamasını çıkararak ilgili sütun ve satıra yazarak veriçerçevesini dönüştürmek (transform etmek) için aşağıdaki gibi bir ifade kullanılabilir. Yine bu işlemin sonucunun yeni bir veriçerçevesi tanımladığını ve saklanmak isteniyorsa bu veriçerçevesine bir isim verilmesi gerektiğini unutmayınız." ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " kategori veri1 veri2\n", "0 A 0 5\n", "1 B 1 0\n", "2 C 2 3\n", "3 A 3 3\n", "4 B 4 7\n", "5 C 5 9\n" ] } ], "source": [ "import numpy as np\n", "rng = np.random.RandomState(0)\n", "df = pd.DataFrame({'kategori': ['A', 'B', 'C', 'A', 'B', 'C'],\n", " 'veri1': range(6),\n", " 'veri2': rng.randint(0, 10, 6)},\n", " columns = ['kategori', 'veri1', 'veri2'])\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
veri1veri2
0-1.51.0
1-1.5-3.5
2-1.5-3.0
31.5-1.0
41.53.5
51.53.0
\n", "
" ], "text/plain": [ " veri1 veri2\n", "0 -1.5 1.0\n", "1 -1.5 -3.5\n", "2 -1.5 -3.0\n", "3 1.5 -1.0\n", "4 1.5 3.5\n", "5 1.5 3.0" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "donusum_fonksiyonu = lambda x: x - x.mean()\n", "df.groupby('kategori').transform(donusum_fonksiyonu)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yöntemi öntegezegen veritabanı üzerinde, her bir yöntemin keşfettiği gezegenlerin parametrelerini o yöntemle bu parametre için keşfedilen gezegenlerin ortalama değerine normalize ederek (bölerek) vermek için kullanalım ve sonucu yörünge dönemi (pl_orbper) için görüntüleyelim." ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pl_name\n", "11 Com b 0.310318\n", "11 UMi b 0.491342\n", "14 And b 0.176884\n", "14 Her b 1.687936\n", "16 Cyg B b 0.760019\n", " ... \n", "ups And b 0.004395\n", "ups And c 0.229631\n", "ups And d 1.214945\n", "ups Leo b 0.366636\n", "xi Aql b 0.130160\n", "Name: pl_orbper, Length: 5005, dtype: float64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def donusum_fonksiyonu(x):\n", " return x / x.mean()\n", "og.groupby('discoverymethod')[['pl_orbeccen','pl_orbper','pl_bmassj']].transform(donusum_fonksiyonu)['pl_orbper']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### apply Metodu ###\n", "\n", "`apply()` metodu herhangi bir fonksiyonun bir `DataFrameGroupBy` nesnesine uygulanmasını sağlar. Her bir grubun birinci veri setindeki ölçümlerini ($veri1$) ikinci veri setindeki ölçümlerin toplamına ($veri2$) normalize etmek istiyor olalım. Aşağıdaki $normalizasyon$ fonksiyonunun `df.groupby('kategori')` ifadesi ile elde edilen `DataFrameGroupBy` nesnesine uygulanması sonucu $veri1$ sütunundaki veri seti her bir grup için o grubun $veri2$ veri setindeki ölçümlerin toplamına bölünmesi (normalize edilmesi) sağlanmıştır." ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " kategori veri1 veri2\n", "0 A 0.000000 5\n", "1 B 0.142857 0\n", "2 C 0.166667 3\n", "3 A 0.375000 3\n", "4 B 0.571429 7\n", "5 C 0.416667 9\n" ] } ], "source": [ "def normalizasyon(x):\n", " x['veri1'] /= x['veri2'].sum()\n", " return(x)\n", "print(df.groupby('kategori').apply(normalizasyon))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`apply()` fonksiyonu oldukça kullanışlı bir fonksiyon olup, herhangi bir fonksiyonun sadece `DataFrameGroupBy` nesnelerine değil, istenen tüm veriçerçevelerine uygulanmasını sağlar. Sonuç istenirse bir `pandas` veri nesnesi istenirse de skaler bir değer olabilir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bir önceki bölümde `transformation()` metoduyla bütun sütunlara uyguladığımız normalizasyonu, sadece yörünge dönemleri bilinen tüm gezegenlerin yörünge dönemlerinin, keşfedildikleri yöntemle keşfedilen tüm gezegenlerin yörünge dönemi ortalamasına oranını hesaplamak üzere kullanabiliriz." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "discoverymethod pl_name \n", "Astrometry DENIS-P J082303.1-491201 b 1.000000\n", "Disk Kinematics HD 97048 b NaN\n", "Eclipse Timing Variations 2MASS J19383260+4603591 b 0.105868\n", " DE CVn b 1.042930\n", " DP Leo b 2.600898\n", " ... \n", "Transit Timing Variations Kepler-539 c 4.760590\n", " Kepler-82 f 0.360529\n", " TOI-2202 c 0.117465\n", " WASP-126 c 0.036323\n", " WASP-18 c 0.010263\n", "Name: pl_orbper, Length: 5005, dtype: float64" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def normalizedonem(x):\n", " return x['pl_orbper'] / x['pl_orbper'].mean()\n", "og.groupby('discoverymethod').apply(normalizedonem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kaynaklar #\n", "\n", "* Python Data Science Handbook, Jake VanderPlas, 2017, O’Reilly Media, Inc.\n", "* Python Data Analytics, 2015, Fabio Nelli, Apress\n", "* [Real Python Tutorial on combining data in pandas](https://realpython.com/pandas-merge-join-and-concat/)\n", "* [pandas Paketi](https://pandas.pydata.org/)\n", "* [pandas Kullanıcı El Kitabı](https://pandas.pydata.org/docs/user_guide/index.html)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 1 }