{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "anaconda-cloud": {}, "hide_input": false, "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.7.4" }, "toc": { "toc_cell": false, "toc_number_sections": false, "toc_section_display": "block", "toc_threshold": 6, "toc_window_display": false }, "colab": { "name": "kl_py_okt_05.ipynb", "provenance": [], "collapsed_sections": [ "UbJtJ2iBsSkI", "ZSsU5LfVsSkW", "o4wyHEeNsSkn", "5PV_zWT_sSkx", "A_dWtusNsSk7", "_xzgrkRisSlK", "JW3lBBJRsSlf", "5Zy7brPksSlw", "wVTIaCLxsSl_", "wGUOLwGQsSmB", "hnGeNctOsSmJ" ], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "qq8TI605sSjd", "colab_type": "text" }, "source": [ "

\n", " \n", " \n", "

\n", "\n", "\n", "

\n", "\n", "\n", "\n", "# Python alapok 5 (Pandas)\n", "\n", "\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "QiG_Mlu2sSjg", "colab_type": "text" }, "source": [ "# A Pandas könyvtár\n", "\n", "Mérési vagy szimulációs adatainkat gyakran célszerűbb a puszta számokat tartalmazó *list* vagy *numpy.array* adatszerkezet helyett a *pandas* könyvtár *DataFrame* osztályában tárolunk, ahol a számok mellett feliratozni is tudjuk a sorokat, illetve oszlopokat, illetve a különböző oszlopokban különböző adattípusok lehetnek.\n", "\n", "A *DataFrame*-re gondolhatunk úgy, mint egy szokásos Excel-táblázatra, az osztályhoz tartozó függvények egy része ugyanis nagyon hasonlít a táblázatkezelőkből ismertekére. Használata első ránézésre talán bonyolultnak tűnhet, de mindenképpen megéri a befektetett energiát.\n", "\n", "A szokásos import:" ] }, { "cell_type": "code", "metadata": { "id": "8GTiN_gCsSjh", "colab_type": "code", "colab": {} }, "source": [ "import pandas as pd" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "a8DjUOQUsSjl", "colab_type": "text" }, "source": [ "## Beolvasás fájlból" ] }, { "cell_type": "markdown", "metadata": { "id": "hnzKWjFUsSjm", "colab_type": "text" }, "source": [ "Legtöbbször vesszővel vagy tabulátorral elválasztott értékeket (amit a `sep` kulcsszóval állíthatunk be, ha szükséges) olvasunk be egyszerű szövegfájlokból. Itt be kell állítanunk, hogy a táblázatunk tartalmaz-e fejlécet (`header`), illetve hogy a soroknak van-e nevük (`index`).\n", "\n", "Az alapértelmezett beállítás megpróbálja kitalálni, hogy van-e fejléc, és a sorokat magától megszámozza." ] }, { "cell_type": "code", "metadata": { "id": "RBTXR4BxsSjm", "colab_type": "code", "colab": {}, "outputId": "47d65e1d-7033-4415-d2a6-d07a7bcc8a8d" }, "source": [ "pd.read_csv(\"data/kisnevsor.csv\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
Unnamed: 0EszterOrsiNemKor
0Bálint23fiú20
1Csenge44lány22
2István54fiú19
3Zita35lány20
\n", "
" ], "text/plain": [ " Unnamed: 0 Eszter Orsi Nem Kor\n", "0 Bálint 2 3 fiú 20\n", "1 Csenge 4 4 lány 22\n", "2 István 5 4 fiú 19\n", "3 Zita 3 5 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 2 } ] }, { "cell_type": "markdown", "metadata": { "id": "rzGloMGwsSjp", "colab_type": "text" }, "source": [ "Mi viszont azt szeretnénk, ha a legelső oszlopot a sorok neveiként olvasnánk be, mint az exceles esetben." ] }, { "cell_type": "code", "metadata": { "id": "gCJEsbJBsSjq", "colab_type": "code", "colab": {}, "outputId": "f1f4e95f-b97c-492d-fe82-584652d97c72" }, "source": [ "pd.read_csv(\"data/kisnevsor.csv\",index_col=0)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Bálint23fiú20
Csenge44lány22
István54fiú19
Zita35lány20
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Bálint 2 3 fiú 20\n", "Csenge 4 4 lány 22\n", "István 5 4 fiú 19\n", "Zita 3 5 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "qTi1VTiHsSjs", "colab_type": "text" }, "source": [ "Most a fejlécbeolvasót kikapcsoljuk. Így az első sor ismeretlen (`NaN`) sorfelirattal bekerül az értékek elé, az oszlopok pedig 0-tól számozódnak." ] }, { "cell_type": "code", "metadata": { "id": "gRIgeppssSjs", "colab_type": "code", "colab": {}, "outputId": "0a82a933-b65c-405f-e67d-a96b753f9178" }, "source": [ "pd.read_csv(\"data/kisnevsor.csv\",header=None,index_col=0)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
1234
0
NaNEszterOrsiNemKor
Bálint23fiú20
Csenge44lány22
István54fiú19
Zita35lány20
\n", "
" ], "text/plain": [ " 1 2 3 4\n", "0 \n", "NaN Eszter Orsi Nem Kor\n", "Bálint 2 3 fiú 20\n", "Csenge 4 4 lány 22\n", "István 5 4 fiú 19\n", "Zita 3 5 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "markdown", "metadata": { "id": "10Nw693UsSju", "colab_type": "text" }, "source": [ "Ha elfelejtettük beállítani az oszlopok neveit eredetileg, utólag is megtehetjük azt a `.set_index(oszlopnev)` függvény segítségével. A `set_index()` függvény visszatérési értéke alapesetben az új oszloppal indexelt *DataFrame*." ] }, { "cell_type": "code", "metadata": { "id": "Ehm1qyRgsSjv", "colab_type": "code", "colab": {} }, "source": [ "nevsor=pd.read_csv(\"data/kisnevsor.csv\")\n", "ujnevsor=nevsor.set_index(\"Unnamed: 0\")" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "YengTGjVsSjx", "colab_type": "text" }, "source": [ "Ezt megtehettük volna úgy is, hogy a `nevsor` nevű *DataFrame*-et rögtön felülírjuk helyben (`inplace`):" ] }, { "cell_type": "code", "metadata": { "id": "LMw5UIYUsSjy", "colab_type": "code", "colab": {} }, "source": [ "nevsor.set_index(\"Unnamed: 0\",inplace=True)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "btQIVVK5sSj0", "colab_type": "text" }, "source": [ "## Adatok elérése" ] }, { "cell_type": "markdown", "metadata": { "id": "wAQ8FXJBsSj0", "colab_type": "text" }, "source": [ "A *pandas* a *DataFrame*-ben tárolt értékeket elsősorban a fejléccel és a sorok neveivel teszi elérhetővé.\n", "\n", "Ha egy oszlop nevét *string*ként szögletes zárójelekben írjuk a *DataFrame* neve mögé, visszakapjuk az oszlopot." ] }, { "cell_type": "code", "metadata": { "id": "jPvv9zxlsSj1", "colab_type": "code", "colab": {}, "outputId": "25addf3c-226b-4142-b388-8fb19527d563" }, "source": [ "df=pd.read_csv(\"data/kisnevsor.csv\",index_col=0)\n", "print(df[\"Eszter\"])" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Bálint 2\n", "Csenge 4\n", "István 5\n", "Zita 3\n", "Name: Eszter, dtype: int64\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "GMqh6YeMsSj3", "colab_type": "text" }, "source": [ "Ha több oszlopot is vissza szeretnénk kapni, akkor azokat egy stringeket tartalmazó listában írjuk a *DataFrame* mögötti szögletes zárójelbe." ] }, { "cell_type": "code", "metadata": { "id": "XxLvMGNhsSj4", "colab_type": "code", "colab": {}, "outputId": "3c11d80b-f6e0-4c4c-a79c-e6ab1c373799" }, "source": [ "df[[\"Eszter\",\"Nem\",\"Kor\"]]" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterNemKor
Bálint2fiú20
Csenge4lány22
István5fiú19
Zita3lány20
\n", "
" ], "text/plain": [ " Eszter Nem Kor\n", "Bálint 2 fiú 20\n", "Csenge 4 lány 22\n", "István 5 fiú 19\n", "Zita 3 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "h1cWVqfDsSj6", "colab_type": "text" }, "source": [ "Ha egy oszlopnak szeretnénk elérni az egyik elemét:" ] }, { "cell_type": "code", "metadata": { "id": "8MAw2pXhsSj6", "colab_type": "code", "colab": {}, "outputId": "838ec6a3-7074-4281-e839-618fb6cc811d" }, "source": [ "print(df[\"Eszter\"][\"Zita\"])" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "3\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "9Hlj3S8QsSj8", "colab_type": "text" }, "source": [ "Vigyázat, mindig először az oszlop nevét írtuk! Ha egy sort szeretnénk visszakapni, az `ix` objektumot kell használunk." ] }, { "cell_type": "code", "metadata": { "id": "wMPZNJD2sSj9", "colab_type": "code", "colab": {}, "outputId": "63205730-7b30-4388-f7bf-2805d822dd76" }, "source": [ "df.ix[\"Zita\"]" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Eszter 3\n", "Orsi 5\n", "Nem lány\n", "Kor 20\n", "Name: Zita, dtype: object" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "bUPmRYChsSj_", "colab_type": "text" }, "source": [ "Aki szeretné ugyanúgy számokkal indexelni a *DataFrame*-et, mint egy *array*-t, annak erre az `iloc` biztosít lehetőséget. Nézzük meg az előző eléréseket `iloc`-kal!" ] }, { "cell_type": "code", "metadata": { "id": "d_G696kusSkA", "colab_type": "code", "colab": {}, "outputId": "18e48c84-e92a-4596-ab7e-15dd5c6da7c0" }, "source": [ "df.iloc[:,0] # az első (0.) oszlop" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Bálint 2\n", "Csenge 4\n", "István 5\n", "Zita 3\n", "Name: Eszter, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "code", "metadata": { "id": "3U5ACcXJsSkC", "colab_type": "code", "colab": {}, "outputId": "e148c5f3-9e73-444e-dc58-ae1a1a2e469c" }, "source": [ "df.iloc[0,0] # az első sor első eleme" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "2" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "XN4buNTosSkF", "colab_type": "text" }, "source": [ "Sőt, a *DataFrame* belsejét átalakíthatjuk *numpy* *array*-jé, és alkalmazhatjuk rá a korábban tanult módszereket :-)" ] }, { "cell_type": "code", "metadata": { "id": "NHG2ken8sSkG", "colab_type": "code", "colab": {}, "outputId": "5406e6f8-7c0d-495d-e1c4-2332a1aaa461" }, "source": [ "df.as_matrix()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[2, 3, 'fiú', 20],\n", " [4, 4, 'lány', 22],\n", " [5, 4, 'fiú', 19],\n", " [3, 5, 'lány', 20]], dtype=object)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "UbJtJ2iBsSkI", "colab_type": "text" }, "source": [ "### Az oszlopnevek és a sornevek elérése" ] }, { "cell_type": "markdown", "metadata": { "id": "bVJQA9yGsSkJ", "colab_type": "text" }, "source": [ "Írassuk ki a táblázatunk oszlopainak a nevét!" ] }, { "cell_type": "code", "metadata": { "id": "VBgThyGnsSkJ", "colab_type": "code", "colab": {}, "outputId": "7f4021d8-6d5f-4083-ba9f-b76d7960a80b" }, "source": [ "df.columns" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['Eszter', 'Orsi', 'Nem', 'Kor'], dtype='object')" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "aH6EwiD1sSkL", "colab_type": "text" }, "source": [ "Írassuk ki a táblázatunk sorainak a nevét!" ] }, { "cell_type": "code", "metadata": { "id": "WkixlymcsSkM", "colab_type": "code", "colab": {}, "outputId": "9a96f50d-34f4-4a6a-a7ac-51fb83ccb4a5" }, "source": [ "df.index" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['Bálint', 'Csenge', 'István', 'Zita'], dtype='object')" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "cell_type": "markdown", "metadata": { "id": "kJoF-cB3sSkQ", "colab_type": "text" }, "source": [ "Szükség lehet rá, hogy a fenti listákat tényleg Python-féle *list*-ként kapjuk vissza." ] }, { "cell_type": "code", "metadata": { "id": "HpbFwFHCsSkR", "colab_type": "code", "colab": {}, "outputId": "9c476608-07c1-4559-9c0a-8c6982666efc" }, "source": [ "df.columns.tolist()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['Eszter', 'Orsi', 'Nem', 'Kor']" ] }, "metadata": { "tags": [] }, "execution_count": 14 } ] }, { "cell_type": "code", "metadata": { "id": "dSq17RXmsSkU", "colab_type": "code", "colab": {}, "outputId": "b5f2a899-b9a3-4ab5-b0f4-293ba57be072" }, "source": [ "list(df.columns)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['Eszter', 'Orsi', 'Nem', 'Kor']" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "ZSsU5LfVsSkW", "colab_type": "text" }, "source": [ "## Egyszerű sor- és oszlopműveletek" ] }, { "cell_type": "markdown", "metadata": { "id": "52HR1cJssSkW", "colab_type": "text" }, "source": [ "A *DataFrame*-re is könnyű néhány beépített függvény segítségével különböző aggregált értékeket számolni.\n", "\n", "Például álljon itt oszloponként a számok összege:" ] }, { "cell_type": "code", "metadata": { "id": "xyJKhZEKsSkX", "colab_type": "code", "colab": {}, "outputId": "7a7e5a3f-c0b8-4303-8b14-e29f2f2e9e16" }, "source": [ "df.sum()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Eszter 14\n", "Orsi 16\n", "Nem fiúlányfiúlány\n", "Kor 81\n", "dtype: object" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "HxCyzzfzsSkZ", "colab_type": "text" }, "source": [ "Mit tegyünk, ha ezt soronként szeretnénk visszakapni? Változtassuk meg az összegzés \"tengelyét\" (`axis`)! Az előző eset ugyanis az alapértelmezett `axis=0` volt, ami oszloponként végzi a műveletet. Csak a jegyeket tartalmazó oszlopokat összegezzük." ] }, { "cell_type": "code", "metadata": { "id": "4mP4NT-qsSka", "colab_type": "code", "colab": {}, "outputId": "9bec9f3c-5542-4162-b20b-1bfe95f51ba5" }, "source": [ "df[[\"Eszter\",\"Orsi\"]].sum(axis=1)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Bálint 5\n", "Csenge 8\n", "István 9\n", "Zita 8\n", "dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 17 } ] }, { "cell_type": "markdown", "metadata": { "id": "gXWV1DdusSkc", "colab_type": "text" }, "source": [ "Számoltassuk meg, hány elem van az oszlopokban, illetve a sorokban!" ] }, { "cell_type": "code", "metadata": { "id": "IzYUEFafsSkd", "colab_type": "code", "colab": {}, "outputId": "4d115df5-8089-4d16-e5a7-b273ec6b4e3d" }, "source": [ "df.count()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Eszter 4\n", "Orsi 4\n", "Nem 4\n", "Kor 4\n", "dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 18 } ] }, { "cell_type": "code", "metadata": { "id": "JE_ODWKxsSkf", "colab_type": "code", "colab": {}, "outputId": "2589847f-215f-46ba-e9e9-a00ca723439a" }, "source": [ "df.count(axis=1)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Bálint 4\n", "Csenge 4\n", "István 4\n", "Zita 4\n", "dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 19 } ] }, { "cell_type": "markdown", "metadata": { "id": "aiHCqZ9zsSkg", "colab_type": "text" }, "source": [ "Ezt persze az *array*-hez hasonlóan is megtehettük volna:" ] }, { "cell_type": "code", "metadata": { "id": "9vy65bT6sSkh", "colab_type": "code", "colab": {}, "outputId": "3b8e492b-5a52-4dd9-8b94-11886b4c8ff3" }, "source": [ "df.shape" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(4, 4)" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "markdown", "metadata": { "id": "b_q0cc6KsSkn", "colab_type": "text" }, "source": [ "További ötletek beépített függvényekre: `mean, median, min, max, std`." ] }, { "cell_type": "markdown", "metadata": { "id": "o4wyHEeNsSkn", "colab_type": "text" }, "source": [ "## Boolean indexing" ] }, { "cell_type": "markdown", "metadata": { "id": "Gvach_2QsSko", "colab_type": "text" }, "source": [ "Nagyon gyakran előfordul, hogy a táblázatunkból csak bizonyos feltételeknek megfelelő sorokat szeretnénk látni. Ha a táblázat sorainak számával megegyező hosszú igaz/hamis sorozatot adunk meg a *DataFrame* mögötti szögletes zárójelben, akkor csak az igaz elemeket fogjuk visszakapni visszatérési értékként.\n", "\n", "Először nézzük meg, mi történik, ha megkérdezzük, hogy egy oszlop egyenlő-e egy értékkel:" ] }, { "cell_type": "code", "metadata": { "id": "NVDN71qHsSko", "colab_type": "code", "colab": {}, "outputId": "d6dc601d-bd79-45f4-9340-b14ab7f36f73" }, "source": [ "df[\"Nem\"]==\"lány\"" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Bálint False\n", "Csenge True\n", "István False\n", "Zita True\n", "Name: Nem, dtype: bool" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "markdown", "metadata": { "id": "0KLf5yWisSkr", "colab_type": "text" }, "source": [ "Láttuk, hogy minden sorhoz kaptunk egy igaz/hamis értéket. Most a fenti kifejezést beírjuk a `[]`-be:" ] }, { "cell_type": "code", "metadata": { "id": "Qtw7U_tDsSks", "colab_type": "code", "colab": {}, "outputId": "468d811a-37f3-42b0-d655-4cbb6fb0fccd" }, "source": [ "df[df[\"Nem\"]==\"lány\"]" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Csenge44lány22
Zita35lány20
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Csenge 4 4 lány 22\n", "Zita 3 5 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 22 } ] }, { "cell_type": "markdown", "metadata": { "id": "OHd1JCYXsSkt", "colab_type": "text" }, "source": [ "De más feltételt is megadhatunk, például hogy kinek adott Eszter 3-asnál jobb jegyet." ] }, { "cell_type": "code", "metadata": { "id": "GC7eUSJjsSku", "colab_type": "code", "colab": {}, "outputId": "231f1f4d-e7a1-47ac-bb5b-f8178477b699" }, "source": [ "df[df[\"Eszter\"]>3]" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Csenge44lány22
István54fiú19
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Csenge 4 4 lány 22\n", "István 5 4 fiú 19" ] }, "metadata": { "tags": [] }, "execution_count": 23 } ] }, { "cell_type": "markdown", "metadata": { "id": "yCbO3yK3sSkv", "colab_type": "text" }, "source": [ "Két feltételt összefűzhetünk egymáshoz, ilyenkor a `&` és a `|` operátorokat használjuk **and** és **or** helyett, mert azok nem tudnak két sorozatot elemenként összehasonlítani. A feltételeket zárójelbe kell tenni, különben hibát kapunk.\n", "\n", "Ezek alapján az, akinek Eszter hármasnál jobbat adott, és idősebb 20 évesnél:" ] }, { "cell_type": "code", "metadata": { "id": "TnLKffm-sSkw", "colab_type": "code", "colab": {}, "outputId": "96905055-335b-40b9-8a3b-7feb4b8a76ae" }, "source": [ "df[(df[\"Eszter\"]>3) & (df[\"Kor\"]>20)]" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EszterOrsiNemKor
Csenge44lány22
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Csenge 4 4 lány 22" ] }, "metadata": { "tags": [] }, "execution_count": 24 } ] }, { "cell_type": "markdown", "metadata": { "id": "5PV_zWT_sSkx", "colab_type": "text" }, "source": [ "## Sorba rendezés" ] }, { "cell_type": "markdown", "metadata": { "id": "1cTNBapbsSky", "colab_type": "text" }, "source": [ "Szükségünk lehet arra, hogy a táblázatunkat sorba rendezzük valamelyik oszlop szerint. Ilyenkor a `sort_values(by=\"oszlop_neve\")` függvényt használjuk, melynek megadhatjuk, hogy növekvő (`ascending=True`), vagy csökkenő (`ascending=False`) sorrendben szeretnénk-e a rendezést.\n", "\n", "A függvény visszatérési értéke a rendezett táblázat." ] }, { "cell_type": "code", "metadata": { "id": "kIaU9HKbsSk0", "colab_type": "code", "colab": {}, "outputId": "52411338-5799-44fb-fb1c-8c7a25866ffb" }, "source": [ "df.sort_values(by=\"Kor\",ascending=False)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Csenge44lány22
Bálint23fiú20
Zita35lány20
István54fiú19
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Csenge 4 4 lány 22\n", "Bálint 2 3 fiú 20\n", "Zita 3 5 lány 20\n", "István 5 4 fiú 19" ] }, "metadata": { "tags": [] }, "execution_count": 25 } ] }, { "cell_type": "markdown", "metadata": { "id": "lDtYGfuLsSk1", "colab_type": "text" }, "source": [ "Ha azt szeretnénk, hogy az eredeti *DataFrame*-ben rendezve tárolódjanak el a sorok, be kell kapcsolnunk az `inplace=True` paramétert, ami felülírja a *DataFrame*-et a rendezés után." ] }, { "cell_type": "code", "metadata": { "id": "GLRrB76xsSk2", "colab_type": "code", "colab": {} }, "source": [ "df.sort_values(by=\"Kor\",ascending=False,inplace=True)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ME5TaKDQsSk3", "colab_type": "text" }, "source": [ "Persze, ezt elérhettük volna szokásos értékadással is." ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "X4oOtMt_sSk4", "colab_type": "code", "colab": {} }, "source": [ "df=df.sort_values(by=\"Kor\",ascending=False)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "w6NJgR1msSk5", "colab_type": "text" }, "source": [ "Ha a *DataFrame* indexe szerint szeretnénk sorba rendezni, akkor a `sort_index()` függvény segít (itt is választhatjuk, hogy helyben szeretnénk-e a rendezést az `inplace=True` segítségével):" ] }, { "cell_type": "code", "metadata": { "id": "zdikI0zksSk6", "colab_type": "code", "colab": {} }, "source": [ "df.sort_index(inplace=True)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "A_dWtusNsSk7", "colab_type": "text" }, "source": [ "## Új sor/oszlop hozzáadása, törlés" ] }, { "cell_type": "markdown", "metadata": { "id": "KtOgh3_osSk7", "colab_type": "text" }, "source": [ "Ha új sort szeretnénk hozzáadni a táblázathoz, akkor a `.loc[\"Új_sor_indexe\"]` változónak egy, az oszlopok számával megegyező hosszúságú listát kell odaadnunk." ] }, { "cell_type": "code", "metadata": { "id": "lmfXRF0dsSk8", "colab_type": "code", "colab": {}, "outputId": "03792295-acd8-4994-ddf6-02d034e1c603" }, "source": [ "df.loc[\"Dávid\"]=[5,5,\"fiú\",20]\n", "df" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Bálint23fiú20
Csenge44lány22
István54fiú19
Zita35lány20
Dávid55fiú20
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Bálint 2 3 fiú 20\n", "Csenge 4 4 lány 22\n", "István 5 4 fiú 19\n", "Zita 3 5 lány 20\n", "Dávid 5 5 fiú 20" ] }, "metadata": { "tags": [] }, "execution_count": 29 } ] }, { "cell_type": "markdown", "metadata": { "id": "P5GU6p9xsSk-", "colab_type": "text" }, "source": [ "Ha új oszlopot, akkor hasonlóan járunk el, de nem szükséges a `loc`, mert az a sorokat indexeli." ] }, { "cell_type": "code", "metadata": { "id": "0ZCJdSlZsSk_", "colab_type": "code", "colab": {}, "outputId": "c409da13-ab29-45ba-a5b6-7d19153a0406" }, "source": [ "df[\"Emelt\"]=[0,0,1,1,0]\n", "df" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKorEmelt
Bálint23fiú200
Csenge44lány220
István54fiú191
Zita35lány201
Dávid55fiú200
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor Emelt\n", "Bálint 2 3 fiú 20 0\n", "Csenge 4 4 lány 22 0\n", "István 5 4 fiú 19 1\n", "Zita 3 5 lány 20 1\n", "Dávid 5 5 fiú 20 0" ] }, "metadata": { "tags": [] }, "execution_count": 30 } ] }, { "cell_type": "markdown", "metadata": { "id": "J5GTq551sSlF", "colab_type": "text" }, "source": [ "Ha sort szeretnénk törölni, a `drop` függvénnyel tehetjük meg." ] }, { "cell_type": "code", "metadata": { "id": "190TS99lsSlG", "colab_type": "code", "colab": {}, "outputId": "fe3b2725-7771-486b-d792-51846cf129c5" }, "source": [ "df.drop(\"Bálint\",inplace=True)\n", "df" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKorEmelt
Csenge44lány220
István54fiú191
Zita35lány201
Dávid55fiú200
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor Emelt\n", "Csenge 4 4 lány 22 0\n", "István 5 4 fiú 19 1\n", "Zita 3 5 lány 20 1\n", "Dávid 5 5 fiú 20 0" ] }, "metadata": { "tags": [] }, "execution_count": 31 } ] }, { "cell_type": "markdown", "metadata": { "id": "t1fGHz0-sSlH", "colab_type": "text" }, "source": [ "Elég ritkán, de szeretnénk a táblázatunkból oszlopokat törölni:" ] }, { "cell_type": "code", "metadata": { "id": "N-axsRN-sSlI", "colab_type": "code", "colab": {} }, "source": [ "del df[\"Kor\"] #ritkán" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "oU3DtDfasSlJ", "colab_type": "code", "colab": {} }, "source": [ "df[\"Kor\"]=[22,19,20,20]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "_xzgrkRisSlK", "colab_type": "text" }, "source": [ "## Csoportosítás" ] }, { "cell_type": "markdown", "metadata": { "id": "8R6AqgT7sSlL", "colab_type": "text" }, "source": [ "Egy oszlop értékei szerint csoportosíthatjuk a *DataFrame*-et, és utána a csoportokon végezhetünk műveleteket.\n", "\n", "Például az emelt szintű érettségit tevők (1), illtve nem tevők (0) maximum jegyeit láthatjuk a következő sorban.\n", "\n", "Figyeljük meg, hogy a `Nem` oszlop maximális értéke mindkét csoportban a `\"lány\"`, hiszen az hátrébb áll az abc-ben, mint a fiú." ] }, { "cell_type": "code", "metadata": { "id": "MBVlSfzcsSlL", "colab_type": "code", "colab": {}, "outputId": "e1223292-8eea-4520-e01d-4c65f353ad93" }, "source": [ "df.groupby(\"Emelt\").max()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemKor
Emelt
055lány22
155lány20
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Kor\n", "Emelt \n", "0 5 5 lány 22\n", "1 5 5 lány 20" ] }, "metadata": { "tags": [] }, "execution_count": 34 } ] }, { "cell_type": "markdown", "metadata": { "id": "b1oJLPRosSlN", "colab_type": "text" }, "source": [ "Egyszerre két oszlop szerint is csoportosíthatunk, ilyenkor listát kell a `groupby`-nak átadnunk. Itt már nem csak az `Emelt` oszlop, hanem a `Nem` oszlop is a táblázat indexének a része, ezt hívjuk többszintű indexelésnek. A továbbiakban az órán erre nem lesz szükség, csak a példa kedvéért áll itt." ] }, { "cell_type": "code", "metadata": { "id": "doeX8mefsSlO", "colab_type": "code", "colab": {}, "outputId": "6ddb7e25-b0b0-437a-e3db-0400df4c1275" }, "source": [ "df.groupby([\"Emelt\",\"Nem\"]).max()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiKor
EmeltNem
0fiú5520
lány4422
1fiú5419
lány3520
\n", "
" ], "text/plain": [ " Eszter Orsi Kor\n", "Emelt Nem \n", "0 fiú 5 5 20\n", " lány 4 4 22\n", "1 fiú 5 4 19\n", " lány 3 5 20" ] }, "metadata": { "tags": [] }, "execution_count": 35 } ] }, { "cell_type": "markdown", "metadata": { "id": "86b9lJ71sSlQ", "colab_type": "text" }, "source": [ "# Érettségi adatok feldolgozása" ] }, { "cell_type": "markdown", "metadata": { "id": "Wvs9-iggsSlR", "colab_type": "text" }, "source": [ "Az alábbiakban az elmúlt pár év érettségi statisztikai adatait fogjuk megvizsgálni. Ez a példa sok szempontból jól illusztrál olyan problémákat, amelyek valós adatbázis-elemzések kapcsán felmerülhetnek.\n", "Ilyen például a hiányzó adatok kezelése, vagy a nem egészen kompatibilis adatbázisok egységes kezelése.\n", "Az érettségi adatokat a fenti honlap az előzőekben megismert elválasztóval tagolt tagolt (comma separated value, röviden csv) formátumban teszi elérhetővé, itt az elválasztójel a pontosvessző." ] }, { "cell_type": "markdown", "metadata": { "id": "oKbb10FjsSlR", "colab_type": "text" }, "source": [ "Mivel ékezetes karakterek is vannak a fájlban, át kell állítanunk a karakterkódolást is a beolvasásnál. Az értékeket a sorokban a \";\" karakter választja el, a sorok nevei a 0. oszlopban vannak." ] }, { "cell_type": "code", "metadata": { "id": "QXsFyub7sSlR", "colab_type": "code", "colab": {} }, "source": [ "erettsegi_adat=pd.read_csv(\"data/erettsegi.csv.gz\",encoding=\"utf8\",sep=\";\",index_col=0)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Dr8S6pZGsSlS", "colab_type": "text" }, "source": [ "Listáztassuk ki, milyen oszlopnevek vannak a fájlban!" ] }, { "cell_type": "code", "metadata": { "id": "2S8Su3izsSlT", "colab_type": "code", "colab": {}, "outputId": "c20e1a73-b134-4ca4-c63f-2e3dd7b9e0b1" }, "source": [ "print(\"\\n\".join(erettsegi_adat.columns.tolist()))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "intézmény megyéje\n", "intézmény városa\n", "vizsgázó évfolyama\n", "vizsgázó képzési típusa\n", "vizsgázó neme\n", "vizsgázó képzési munkarendje\n", "vizsgatárgy neve\n", "vizsga szintje\n", "vizsga fajtája\n", "vizsgamentesség\n", "vizsga nyelve\n", "érdemjegy\n", "össz százalék\n", "össz pontszám\n", "vizsgázó részvétele\n", "I. feleletválasztós kérdéssor\n", "II. esszé: tartalom\n", "II. esszé: kifejtés módja\n", "III. összetett feladatok\n", "írásbeli pontszám\n", "mérés és tételkifejtés: tartalmi helyesség\n", "mérés és tételkifejtés: felépítés, kifejtés\n", "szóbeli pontszám\n", "év\n", "szint\n", "időszak\n", "egy téma kifejtése kísérlettel vagy méréssel: tartalom\n", "egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtés\n", "II. összetett feladatok\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "nkYqmrfqsSlV", "colab_type": "text" }, "source": [ "Látható, hogy az `év`, `szint` megadják, hogy melyik évben, melyik szintű érettségiről van szó. Azt is megállapíthatjuk, hogy ősszel vagy tavasszal (`időszak`) írta-e a diák az érettségit, az iskolájáról és a képzési típusról is rögzítve van a statisztika. Emellett részletes írásbeli és szóbeli, illetve összpontszám, összesített százalék is szerepel az adatok között.\n", "\n", "Érdemes az első néhány sort kiíratni példaként, hogy lássuk, mivel is van dolgunk. Most transzponálva írjuk ki, hogy elférjen a képernyőre." ] }, { "cell_type": "code", "metadata": { "id": "7efvnaVssSlV", "colab_type": "code", "colab": {}, "outputId": "a56e942c-7164-4f28-a07b-3e6be63efe97" }, "source": [ "erettsegi_adat.head().transpose()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
01234
intézmény megyéjeBudapestBudapestBudapestBudapestBudapest
intézmény városaBudapestBudapestBudapestBudapestBudapest
vizsgázó évfolyama1212121312
vizsgázó képzési típusagimnáziumgimnáziumgimnáziumgimnáziumgimnázium
vizsgázó nemeférfiférfiférfi
vizsgázó képzési munkarendjenappalinappalinappalinappalinappali
vizsgatárgy nevefizikafizikafizikafizikafizika
vizsga szintjeközépközépközépközépközép
vizsga fajtájaelõrehozottelõrehozottelõrehozottelõrehozottelõrehozott
vizsgamentesség-----
vizsga nyelvemagyarmagyarmagyarmagyarmagyar
érdemjegy11535
össz százalék2619974084
össz pontszám402914661126
vizsgázó részvételenem jelent megnem jelent megmegjelentmegjelentmegjelent
I. feleletválasztós kérdéssorNaNNaN381424
II. esszé: tartalomNaNNaNNaNNaNNaN
II. esszé: kifejtés módjaNaNNaNNaNNaNNaN
III. összetett feladatokNaNNaNNaNNaNNaN
írásbeli pontszámNaNNaN862366
mérés és tételkifejtés: tartalmi helyességNaNNaNNaNNaNNaN
mérés és tételkifejtés: felépítés, kifejtésNaNNaNNaNNaNNaN
szóbeli pontszámNaNNaN603860
év20132013201320132013
szintKKKKK
időszaktavasztavasztavasztavasztavasz
egy téma kifejtése kísérlettel vagy méréssel: tartalomNaNNaN553655
egy téma kifejtése kísérlettel vagy méréssel: felépítés, kifejtésNaNNaN525
II. összetett feladatokNaNNaN48942
\n", "
" ], "text/plain": [ " 0 \\\n", "intézmény megyéje Budapest \n", "intézmény városa Budapest \n", "vizsgázó évfolyama 12 \n", "vizsgázó képzési típusa gimnázium \n", "vizsgázó neme férfi \n", "vizsgázó képzési munkarendje nappali \n", "vizsgatárgy neve fizika \n", "vizsga szintje közép \n", "vizsga fajtája elõrehozott \n", "vizsgamentesség - \n", "vizsga nyelve magyar \n", "érdemjegy 1 \n", "össz százalék 26 \n", "össz pontszám 40 \n", "vizsgázó részvétele nem jelent meg \n", "I. feleletválasztós kérdéssor NaN \n", "II. esszé: tartalom NaN \n", "II. esszé: kifejtés módja NaN \n", "III. összetett feladatok NaN \n", "írásbeli pontszám NaN \n", "mérés és tételkifejtés: tartalmi helyesség NaN \n", "mérés és tételkifejtés: felépítés, kifejtés NaN \n", "szóbeli pontszám NaN \n", "év 2013 \n", "szint K \n", "időszak tavasz \n", "egy téma kifejtése kísérlettel vagy méréssel: t... NaN \n", "egy téma kifejtése kísérlettel vagy méréssel: f... NaN \n", "II. összetett feladatok NaN \n", "\n", " 1 \\\n", "intézmény megyéje Budapest \n", "intézmény városa Budapest \n", "vizsgázó évfolyama 12 \n", "vizsgázó képzési típusa gimnázium \n", "vizsgázó neme nõ \n", "vizsgázó képzési munkarendje nappali \n", "vizsgatárgy neve fizika \n", "vizsga szintje közép \n", "vizsga fajtája elõrehozott \n", "vizsgamentesség - \n", "vizsga nyelve magyar \n", "érdemjegy 1 \n", "össz százalék 19 \n", "össz pontszám 29 \n", "vizsgázó részvétele nem jelent meg \n", "I. feleletválasztós kérdéssor NaN \n", "II. esszé: tartalom NaN \n", "II. esszé: kifejtés módja NaN \n", "III. összetett feladatok NaN \n", "írásbeli pontszám NaN \n", "mérés és tételkifejtés: tartalmi helyesség NaN \n", "mérés és tételkifejtés: felépítés, kifejtés NaN \n", "szóbeli pontszám NaN \n", "év 2013 \n", "szint K \n", "időszak tavasz \n", "egy téma kifejtése kísérlettel vagy méréssel: t... NaN \n", "egy téma kifejtése kísérlettel vagy méréssel: f... NaN \n", "II. összetett feladatok NaN \n", "\n", " 2 3 \\\n", "intézmény megyéje Budapest Budapest \n", "intézmény városa Budapest Budapest \n", "vizsgázó évfolyama 12 13 \n", "vizsgázó képzési típusa gimnázium gimnázium \n", "vizsgázó neme férfi nõ \n", "vizsgázó képzési munkarendje nappali nappali \n", "vizsgatárgy neve fizika fizika \n", "vizsga szintje közép közép \n", "vizsga fajtája elõrehozott elõrehozott \n", "vizsgamentesség - - \n", "vizsga nyelve magyar magyar \n", "érdemjegy 5 3 \n", "össz százalék 97 40 \n", "össz pontszám 146 61 \n", "vizsgázó részvétele megjelent megjelent \n", "I. feleletválasztós kérdéssor 38 14 \n", "II. esszé: tartalom NaN NaN \n", "II. esszé: kifejtés módja NaN NaN \n", "III. összetett feladatok NaN NaN \n", "írásbeli pontszám 86 23 \n", "mérés és tételkifejtés: tartalmi helyesség NaN NaN \n", "mérés és tételkifejtés: felépítés, kifejtés NaN NaN \n", "szóbeli pontszám 60 38 \n", "év 2013 2013 \n", "szint K K \n", "időszak tavasz tavasz \n", "egy téma kifejtése kísérlettel vagy méréssel: t... 55 36 \n", "egy téma kifejtése kísérlettel vagy méréssel: f... 5 2 \n", "II. összetett feladatok 48 9 \n", "\n", " 4 \n", "intézmény megyéje Budapest \n", "intézmény városa Budapest \n", "vizsgázó évfolyama 12 \n", "vizsgázó képzési típusa gimnázium \n", "vizsgázó neme férfi \n", "vizsgázó képzési munkarendje nappali \n", "vizsgatárgy neve fizika \n", "vizsga szintje közép \n", "vizsga fajtája elõrehozott \n", "vizsgamentesség - \n", "vizsga nyelve magyar \n", "érdemjegy 5 \n", "össz százalék 84 \n", "össz pontszám 126 \n", "vizsgázó részvétele megjelent \n", "I. feleletválasztós kérdéssor 24 \n", "II. esszé: tartalom NaN \n", "II. esszé: kifejtés módja NaN \n", "III. összetett feladatok NaN \n", "írásbeli pontszám 66 \n", "mérés és tételkifejtés: tartalmi helyesség NaN \n", "mérés és tételkifejtés: felépítés, kifejtés NaN \n", "szóbeli pontszám 60 \n", "év 2013 \n", "szint K \n", "időszak tavasz \n", "egy téma kifejtése kísérlettel vagy méréssel: t... 55 \n", "egy téma kifejtése kísérlettel vagy méréssel: f... 5 \n", "II. összetett feladatok 42 " ] }, "metadata": { "tags": [] }, "execution_count": 38 } ] }, { "cell_type": "markdown", "metadata": { "id": "5kN0KYk1sSlX", "colab_type": "text" }, "source": [ "Itt aztán már tényleg nagy hasznát vesszük a fentebb tanult csoportosítási, aggregálási műveleteknek, a következőkben felteszünk néhány példakérdést, és megválaszoljuk azt." ] }, { "cell_type": "markdown", "metadata": { "id": "rRvJywFcsSlZ", "colab_type": "text" }, "source": [ "* Melyik évben mennyi volt az emelt szintű érettségik jegyeinek átlaga?\n", "\n", "Ehhez először kiválasztjuk az emelt szintű érettségit tartalmazó sorokat, majd azokat év szerint csoportosítjuk. Kiválasztjuk az \"érdemjegy\" oszlopot, amit a végén átlagolunk. A csoportosítás miatt az átlag évenként kerül kiszámítása." ] }, { "cell_type": "code", "metadata": { "id": "qREEp0llsSla", "colab_type": "code", "colab": {}, "outputId": "8e50bb76-e5c7-460b-cb72-289724f472aa" }, "source": [ "erettsegi_adat[erettsegi_adat[\"szint\"]==\"E\"].groupby(\"év\")[\"érdemjegy\"].mean()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "év\n", "2011 4.125000\n", "2012 4.429338\n", "2013 4.232607\n", "2014 4.404090\n", "2015 4.432165\n", "Name: érdemjegy, dtype: float64" ] }, "metadata": { "tags": [] }, "execution_count": 39 } ] }, { "cell_type": "markdown", "metadata": { "id": "x-Ex9EsfsSlc", "colab_type": "text" }, "source": [ "* Vajon a fiúk vagy a lányok írtak jobb pontszámú középszintű érettségit 2015-ben?\n", "\n", "A \"\\\" jel csak azért kell, hogy ne írjunk túl hosszú sorokat a Pythonnak, mert az nehéz lenne elolvasni. Ha ilyen jelet teszel a sor végére, akkor az értelmező úgy olvassa, mintha a következő sor a \"\\\" jel helyére lenne fűzve.\n", "\n", "Először logikai indexeléssel kiválasztjuk a 2015-ös középszintű érettségiket tartalmazó sorokat. Több feltételt a sorokra egyszerre az `and` operátor helyett az & operátorral adhatunk meg, és a feltételeket zárójeleznünk kell, hogy jól olvassa az értelmező. \n", "\n", "Ezek után csoportosítunk a vizsgázó neme szerint, majd vesszük az összpontszámok átlagát." ] }, { "cell_type": "code", "metadata": { "id": "23ylulEXsSlc", "colab_type": "code", "colab": {}, "outputId": "4cf20b9d-60e7-47d1-8e49-1af8869b4abc" }, "source": [ "erettsegi_adat[\n", " (erettsegi_adat[\"szint\"]==\"K\") &\\\n", " (erettsegi_adat[\"év\"]==2015)].\\\n", "groupby(\"vizsgázó neme\")[\"össz pontszám\"].mean()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "vizsgázó neme\n", "férfi 100.270135\n", "nõ 97.180775\n", "Name: össz pontszám, dtype: float64" ] }, "metadata": { "tags": [] }, "execution_count": 40 } ] }, { "cell_type": "markdown", "metadata": { "id": "6RsFQeJ1sSle", "colab_type": "text" }, "source": [ "* Számoljuk le, melyik iskolatípusban hány érettségiző jelent meg, illetve nem jelent meg!\n", "\n", "Most egyszerre két oszlop szerint is csoportosítottunk, a csoportosítás alapját képező oszlopok nevét listaként kell megadni a groupby-nak. Utána egy tetszőleges oszlopot (pl. év) kiválasztva megszámláltathatjuk csoportonként a sorokat a count-tal." ] }, { "cell_type": "code", "metadata": { "id": "Tuj3HFOcsSle", "colab_type": "code", "colab": {}, "outputId": "6e30a01f-0cda-4389-ab07-4831c4045e6f" }, "source": [ "erettsegi_adat.groupby([\"vizsgázó képzési típusa\", \"vizsgázó részvétele\"])[\"év\"].count()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "vizsgázó képzési típusa vizsgázó részvétele\n", "- megjelent 1260\n", " nem jelent meg 490\n", "gimnázium megjelent 14448\n", " nem jelent meg 551\n", "szakközép megjelent 5007\n", " nem jelent meg 134\n", "Name: év, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 41 } ] }, { "cell_type": "markdown", "metadata": { "id": "JW3lBBJRsSlf", "colab_type": "text" }, "source": [ "## Ábrázolás" ] }, { "cell_type": "markdown", "metadata": { "id": "FmnvV6h0sSlg", "colab_type": "text" }, "source": [ "A `pandas` nagy erőssége, hogy a *DataFrame*-ekből nagyon rövid szintaxissal lehet egészen elfogadható ábrákat készíteni. Ehhez a `pandas` a `matplotlib` könyvtárat használja, melyet emiatt be is kell importálnunk." ] }, { "cell_type": "code", "metadata": { "id": "sGoiTZwjsSlh", "colab_type": "code", "colab": {}, "outputId": "152bf2b8-34b3-45e1-f7ce-6b4f13453e8b" }, "source": [ "%pylab inline" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "L8KoeYz3sSli", "colab_type": "text" }, "source": [ "Az ábra paramétereit (title, ylabel stb.) a `matplotlib`ben megszokott módon állíthatjuk be.\n", "\n", "Elsőként növeljük meg alapértelmezetten a tengelyfeliratokat:" ] }, { "cell_type": "code", "metadata": { "id": "dWwYcTGosSlj", "colab_type": "code", "colab": {} }, "source": [ "rcParams[\"font.size\"]=15" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KuIvN0RasSls", "colab_type": "text" }, "source": [ "Nézzük meg ábrán is az emelt szintű érettségik évenkénti átlagát! Ehhez csak a fenti parancs végére hozzá kell fűznünk a \"plot\" szócskát. Az oszlopdiagram rajzolásához megadhatjuk a plot függvénynek a kind kulcsszóval, hogy `kind=\"bar\"`. Az x tengely feliratai a DataFrame indexei lesznek, de az y tengelynek már mi kell, hogy nevet adjunk." ] }, { "cell_type": "code", "metadata": { "id": "A7AcGfzTsSlt", "colab_type": "code", "colab": {}, "outputId": "be6328cf-1e0c-42af-ace0-f1a76a5c58a7" }, "source": [ "erettsegi_adat[erettsegi_adat[\"szint\"]==\"E\"].groupby(\"év\")[\"érdemjegy\"].mean().plot(kind=\"bar\", figsize=(12, 9))\n", "ylabel(\"Emelt szint átlag\")\n", "ylim(0,5)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(0, 5)" ] }, "metadata": { "tags": [] }, "execution_count": 44 }, { "output_type": "display_data", "data": { "image/png": "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\nOAMAQIf/D/DgYVayp5KOAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "2nhNULDbsSlu", "colab_type": "text" }, "source": [ "Megnézhetjük kördiagramon, hogy melyik iskolatípusból hányan érettségiztek közép- és emelt szinten 2011 és 2015 között. Ehhez két alábrát készítünk a múltkor tanultakhoz hasonlóan.\n", "\n", "Vajon mit csinált az `autopct` kulcsszó?" ] }, { "cell_type": "code", "metadata": { "id": "Cs8cC2hHsSlu", "colab_type": "code", "colab": {}, "outputId": "c0564d01-9450-47ce-bc04-d2c0f1d555e5" }, "source": [ "subplot(1,2,1)\n", "erettsegi_adat[\n", " (erettsegi_adat[\"vizsgázó részvétele\"]==\"megjelent\") &\\\n", " (erettsegi_adat[\"szint\"]==\"K\")]\\\n", " .groupby([\"vizsgázó képzési típusa\"])\\\n", " .size()\\\n", " .plot(kind=\"pie\",autopct='%.1f',figsize=(20,10))\n", "title(\"Középszint\")\n", "\n", "subplot(1,2,2)\n", "erettsegi_adat[\n", " (erettsegi_adat[\"vizsgázó részvétele\"]==\"megjelent\") &\\\n", " (erettsegi_adat[\"szint\"]==\"E\")]\\\n", " .groupby([\"vizsgázó képzési típusa\"])\\\n", " .size()\\\n", " .plot(kind=\"pie\",autopct='%.1f',figsize=(20,10))\n", "title(\"Emelt szint\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 45 }, { "output_type": "display_data", "data": { "image/png": "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\nV9v/JPAT4JCI2HzYy06j+k3/yiH7LgK2BY5LKf1qKW/3DaBI9ZbCfxMR00bYvV9EbDts3/tq7//d\n2usmRcS/FOS1Kd+LbwmcUjvuiNp7X5FS+q+lZBwN86levVt9DN9DkiTp36SUngGuAY6MiJ1GOiYi\n1ljGaVZoLONYTFI9ceaU1KBqM6gOpTqD6m21W/zeRvVxvzcDt0fEF6g+TeUQYD/gopTSTQARcQpw\neO3YiRFx3LC3+ElK6aGU0hUR8VXgLRGxHdWZVk8BM6kuvr4h1bUHhroXuCEizgOeqL3P3sA3Ukp3\n1o7ZC/hSRFxBdbHQ+cBcqtPJf5ZS+lNErE51evsC4NoRMv49pXT9Cv/hjewuqmtynV573wXAQyml\nn4/S+SVJUuPZfoTxx2JXrsCs8pEMv6XtFKoLpd8aEd8A7qE6mWA2cBjV2/0+8iKvX9GxjGMxSXXD\nckpqHIlh051TSr0RcRjV2Uhvqd3id2pEvAw4k+ogp4vqrXTvA/7fkJdPq51vj9o23EnUbhNMKZ0c\nETcCbwQ+AJSpll531z4f7iqqg5z/AjYG/kF1MPWxIcfcS/UxyntQXYS9SPVpNB8bknMi0F779QUj\nvM8twNAB0UjTwZc2Rfxf/jxTSo9GxEnA+6k+UadEdRDogEiSpNaUgGNq20hewj+XK/i3cdqw8yxz\nf0rpsYjYnupY5DDgOGAR8CjVi5GXLeP1KzqWcSwmqW5ESt7aK2l0RMR6VAutD6eUPrKs4yVJkiRJ\ncs0pSZIkSZIkZWM5JUmSJEmSpGwspySNthdbc0GSJEmSpH/hmlOSJEmSJEnKxplTkiRJkiRJysZy\nSpIkSZIkSdlYTkmSJEmSJCkbyylJkiRJkiRlYzklSZIkSZKkbCynJEmSJEmSlI3llCRJkiRJkrKx\nnJIkSZIkSVI2llOSJEmSJEnKxnJKkiRJkiRJ2VhOSZIkSZIkKRvLKUmSJEmSJGVjOSVJkiRJkqRs\nLKckSZIkSZKUjeWUJEmSJEmSsrGckiRJkiRJUjaWU5IkSZIkScrGckqSJEmSJEnZWE5JkiRJkiQp\nG8spSZIkSZIkZWM5JUmSJEmSpGwspyRJkiRJkpSN5ZQkSZIkSZKysZySJEmSJElSNpZTkiRJkiRJ\nysZySpIkSZIkSdlYTkmSJEmSJCkbyylJkiRJkiRlYzklSZIkSZKkbCynJEmSJEmSlI3llCRJkiRJ\nkrKxnJIkSZIkSVI2llOSJEmSJEnKxnJKkiRJkiRJ2VhOSZIkSZIkKRvLKUmSJEmSJGVjOSVJkiRJ\nkqRsLKckSZIkSZKUjeWUJEmSJEmSsrGckiRJkiRJUjaWU5IkSZIkScrGckqSJEmSJEnZWE5JkiRJ\nkiQpG8spSZIkSZIkZWM5JUmSJEmSpGwspyRJkiRJkpSN5ZQkSZIkSZKysZySJEmSJElSNpZTkiRJ\nkiRJysZySpIkSZIkSdlYTkmSJEmSJCkbyylJkiRJkiRlYzklSZIkSZKkbCynJEmSJEmSlE1b7gCS\n6lNElIDpwIx/2crMokAXQTvQQVAhUQEqQLn26zKJ0pCtjaCXAt0E3QTzgQXACyReYJAXGOBZBngB\nlnxtPvA48AjwWEqpd9z/ECRJksZZREwE1gVm1bbpFJlMkdUoMIlgIjAR6CLRBbSTKAJFUm2DwpCP\nQZGFFJhP8ALwHPAMAzxFH/8g8Vxt3/O1bfivu1NKaXz/FCS1mvDfGan1REQZ2BjYFFibAutQZjbB\nuiTWop+pDNBJhUV00sckYDIlJtPOBAq0Ua22i7Vtab9e/HkB6Ad6gb7ax6HbP/cleuijh366GajV\nVm1000Eb82jjb8DD9PFH+vkz1eLq0drHJx04SZKkehYRRaoX/GYt2cpsTJGNSMyij+kkynTRzWQG\nWZ0Sk+igQlACyrWtNORjiepYa/EWwz4H6Klti2rb0F8voo+F9NFNP90kuoEeCvRSpI8yiaDMkxR4\ngD7upZ/fAn8A/gg8nlIaHPM/OElNz3JKamIR0QZsBMwh2JJ2dmKQOfQygwl0syaJKZSZTIUJBBOo\nXoebAHRRPzf+DlKdR/X8kO1ZeniGHp4D5lOmnzZKPEWB+1nEbSTuBu4BHrW0kiRJ4yki1gB2INiR\ndrYFNmCAteljChV6mEgfUyiwOu1MocRkYDIwCeikWjDViz6q86eerm3/YCH/oI9nKNNHkTJ/JfgD\nPdzDIPdTLa3+mFJ6NmdsSY3FckpqAhERwAbAVgRbUGFHYEt6mUkHi5jGIGvTxXSKrAmsQfUqWzPp\npTpw+gfwBAM8xnz+Rpl+EmV+Tx930M9dVAur36eU+rPmlSRJTaF2G952wA60szeDzGWQyUyjm/Xp\nYhptrEa1fJpIcy2ssgh4BngKeJrE35nPkwzyPB1ALyX+QuK3LOI24FbgN860kjQSyympAUVEAZgD\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "UvXbKjO1sSlw", "colab_type": "text" }, "source": [ "# ☠ Haladóknak" ] }, { "cell_type": "markdown", "metadata": { "id": "5Zy7brPksSlw", "colab_type": "text" }, "source": [ "## Összefűzés, join" ] }, { "cell_type": "markdown", "metadata": { "id": "X_CwBlq0sSlx", "colab_type": "text" }, "source": [ "Két *DataFrame*-et összefűzhetünk egymás alá, ha a `pd.concat()` függvénynek egy ugyanannyi oszlopból álló *DataFrame*-eket tartalmazó listát adunk oda.\n", "\n", "Példánkban kétszer egymás alá írjuk ugyanazt a *DataFrame*-et." ] }, { "cell_type": "code", "metadata": { "id": "JWD-NxS1sSly", "colab_type": "code", "colab": {}, "outputId": "f11c25e0-93a9-48b4-c0c4-0c2dad71f4a1" }, "source": [ "pd.concat([df,df])" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemEmeltKor
Csenge44lány022
István54fiú119
Zita35lány120
Dávid55fiú020
Csenge44lány022
István54fiú119
Zita35lány120
Dávid55fiú020
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Emelt Kor\n", "Csenge 4 4 lány 0 22\n", "István 5 4 fiú 1 19\n", "Zita 3 5 lány 1 20\n", "Dávid 5 5 fiú 0 20\n", "Csenge 4 4 lány 0 22\n", "István 5 4 fiú 1 19\n", "Zita 3 5 lány 1 20\n", "Dávid 5 5 fiú 0 20" ] }, "metadata": { "tags": [] }, "execution_count": 46 } ] }, { "cell_type": "markdown", "metadata": { "id": "pp3ZiQ9lsSl3", "colab_type": "text" }, "source": [ "Létrehozunk egy másik *DataFrame*-et, és egy `Énekkar` nevű oszlopot teszünk bele az előző *DataFrame* indexeivel." ] }, { "cell_type": "code", "metadata": { "id": "MFVuZ2GtsSl3", "colab_type": "code", "colab": {}, "outputId": "74904f80-4c41-4575-ddf1-3cc681de29eb" }, "source": [ "import numpy as np\n", "df2=pd.DataFrame(np.array([[0,1,1,1]]).transpose(),columns=[\"Énekkar\"],index=df.index)\n", "df2" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
Énekkar
Csenge0
István1
Zita1
Dávid1
\n", "
" ], "text/plain": [ " Énekkar\n", "Csenge 0\n", "István 1\n", "Zita 1\n", "Dávid 1" ] }, "metadata": { "tags": [] }, "execution_count": 47 } ] }, { "cell_type": "markdown", "metadata": { "id": "rh1HXU9RsSl5", "colab_type": "text" }, "source": [ "Hogyan tudnánk ezt az oszlopot hozzáilleszteni az előző táblázathoz? Megtehetjük `concat` segítségével, de át kell állítanunk, hogy melyik irányban fűzzük össze a két táblázatot (`axis=1` jelenti, hogy az oszlopok mellé szeretnénk írni)." ] }, { "cell_type": "code", "metadata": { "id": "0wepVd8PsSl5", "colab_type": "code", "colab": {}, "outputId": "dff57a54-e016-42e7-d671-1963cf3dfbc9" }, "source": [ "pd.concat([df,df2],axis=1)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemEmeltKorÉnekkar
Csenge44lány0220
István54fiú1191
Zita35lány1201
Dávid55fiú0201
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Emelt Kor Énekkar\n", "Csenge 4 4 lány 0 22 0\n", "István 5 4 fiú 1 19 1\n", "Zita 3 5 lány 1 20 1\n", "Dávid 5 5 fiú 0 20 1" ] }, "metadata": { "tags": [] }, "execution_count": 48 } ] }, { "cell_type": "markdown", "metadata": { "id": "reeRgKfCsSl7", "colab_type": "text" }, "source": [ "Megtehetnénk azt is, hogy elkészítjük a két táblázat Descartes-szorzatát, azaz az egyikből minden sort összepárosítunk a másik minden sorával, majd kiválogatjuk ebből a sorhalmazból csak azokat a sorokat, amelyekben az indexek megegyeznek.\n", "\n", "(Aki ismeri az SQL-nyelv `join` parancsát, ez az ún. `inner join`.)" ] }, { "cell_type": "code", "metadata": { "id": "W3BJWBOIsSl8", "colab_type": "code", "colab": {}, "outputId": "9a9a879f-fcdb-445d-8cde-db9a058ef719" }, "source": [ "pd.merge(df,df2,left_index=True,right_index=True)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
EszterOrsiNemEmeltKorÉnekkar
Csenge44lány0220
István54fiú1191
Zita35lány1201
Dávid55fiú0201
\n", "
" ], "text/plain": [ " Eszter Orsi Nem Emelt Kor Énekkar\n", "Csenge 4 4 lány 0 22 0\n", "István 5 4 fiú 1 19 1\n", "Zita 3 5 lány 1 20 1\n", "Dávid 5 5 fiú 0 20 1" ] }, "metadata": { "tags": [] }, "execution_count": 49 } ] }, { "cell_type": "markdown", "metadata": { "id": "wVTIaCLxsSl_", "colab_type": "text" }, "source": [ "## Contains" ] }, { "cell_type": "markdown", "metadata": { "id": "AnhK15_1sSl_", "colab_type": "text" }, "source": [ "Ha egy stringeket tartalmazó oszlopban végig kell néznünk, hogy megvan-e valamilyen karaktersorozat:" ] }, { "cell_type": "code", "metadata": { "id": "zcJjuBj0sSmA", "colab_type": "code", "colab": {}, "outputId": "f6fcd11a-debb-43c4-aae2-7c5d4b03ad9d" }, "source": [ "df[\"Nem\"].str.contains(\"án\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Csenge True\n", "István False\n", "Zita True\n", "Dávid False\n", "Name: Nem, dtype: bool" ] }, "metadata": { "tags": [] }, "execution_count": 50 } ] }, { "cell_type": "markdown", "metadata": { "id": "wGUOLwGQsSmB", "colab_type": "text" }, "source": [ "## Apply" ] }, { "cell_type": "markdown", "metadata": { "id": "PtABieDcsSmC", "colab_type": "text" }, "source": [ "Ha egy tetszőleges függvényt szeretnénk egy oszlop minden egyes elemére alkalmazni, megtehetjük az `apply` segítségével. Az apply belsejébe írjuk a függvényt, amit alkalmazni szeretnénk.\n", "\n", "Elsőként például készítünk egy függvényt, ami egy számhoz hozzáad egyet:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "CLgo8C2ssSmC", "colab_type": "code", "colab": {} }, "source": [ "def hozzaad(x):\n", " return x+1" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "47I_yiotsSmD", "colab_type": "text" }, "source": [ "Ezek után mindenkit öregítünk egy évvel." ] }, { "cell_type": "code", "metadata": { "id": "oEj1AEDBsSmE", "colab_type": "code", "colab": {}, "outputId": "6b3e0416-5da0-4707-be0d-7daa8db2943c" }, "source": [ "df[\"Kor\"].apply(hozzaad)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Csenge 23\n", "István 20\n", "Zita 21\n", "Dávid 21\n", "Name: Kor, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 52 } ] }, { "cell_type": "markdown", "metadata": { "id": "dovnu7R6sSmF", "colab_type": "text" }, "source": [ "Az apply-t is lehet soronként is végeztetni az `axis=1` kulcsszó segítségével. Például írjuk meg kézzel azt a függvényt, ami a két kapott jegy átlagát kiszámolja." ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "-6dzLzUYsSmG", "colab_type": "code", "colab": {} }, "source": [ "def atlag(sor):\n", " return (sor[\"Eszter\"]+sor[\"Orsi\"])/2" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "588Wpx37sSmH", "colab_type": "code", "colab": {}, "outputId": "d1d7494b-bb2c-4b09-f8fb-a70204c7e8d9" }, "source": [ "df.apply(atlag,axis=1)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Csenge 4.0\n", "István 4.5\n", "Zita 4.0\n", "Dávid 5.0\n", "dtype: float64" ] }, "metadata": { "tags": [] }, "execution_count": 54 } ] }, { "cell_type": "markdown", "metadata": { "id": "hnGeNctOsSmJ", "colab_type": "text" }, "source": [ "## Pivot" ] }, { "cell_type": "markdown", "metadata": { "id": "4m6RHj0KsSmK", "colab_type": "text" }, "source": [ "Új táblázatot is készíthetünk összesített eredmények alapján az eredetiből. Hogy legyen valami látható eredményünk, adjuk még hozzá Károlyt a táblázatunkhoz." ] }, { "cell_type": "code", "metadata": { "id": "4Bej6kkMsSmL", "colab_type": "code", "colab": {} }, "source": [ "df.loc[\"Károly\"]=[4,5,\"fiú\",1,20]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "FUuQA44dsSmM", "colab_type": "text" }, "source": [ "Most megnézzünk nemenként és emelt szintű érettségi szerint, hogy melyik kategóriában hány ember van. Mivel a csoportosítás készít nekünk egy többszintű indexet, ezt kiiktatjuk a `reset_index(inplace=True)` parancs segítségével." ] }, { "cell_type": "code", "metadata": { "id": "GddCG0rOsSmM", "colab_type": "code", "colab": {}, "outputId": "1893e6d7-9a3b-43b3-8942-a7ec3f22ab64" }, "source": [ "p=df.groupby([\"Nem\",\"Emelt\"]).count()\n", "p.reset_index(inplace=True)\n", "p" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
NemEmeltEszterOrsiKor
0fiú0111
1fiú1222
2lány0111
3lány1111
\n", "
" ], "text/plain": [ " Nem Emelt Eszter Orsi Kor\n", "0 fiú 0 1 1 1\n", "1 fiú 1 2 2 2\n", "2 lány 0 1 1 1\n", "3 lány 1 1 1 1" ] }, "metadata": { "tags": [] }, "execution_count": 56 } ] }, { "cell_type": "markdown", "metadata": { "id": "XDGX3miMsSmP", "colab_type": "text" }, "source": [ "Készítsünk egy táblázatot, melyben a sorok a nemek, az oszlopok, hogy tett-e valaki emelt szintű érettségit, és az értékek a kategóriák leszámlálásai:" ] }, { "cell_type": "code", "metadata": { "id": "VPU0B7OGsSmP", "colab_type": "code", "colab": {}, "outputId": "33a1d9e5-6d07-4c7b-e15b-8f70ac0dbc40" }, "source": [ "p.pivot_table(values=\"Eszter\",columns=\"Emelt\",index=\"Nem\")" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "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", "
Emelt01
Nem
fiú12
lány11
\n", "
" ], "text/plain": [ "Emelt 0 1\n", "Nem \n", "fiú 1 2\n", "lány 1 1" ] }, "metadata": { "tags": [] }, "execution_count": 57 } ] } ] }