{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "
\"Open   \"Open
" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JndnmDMp66FL" }, "source": [ "#### Copyright 2017 Google LLC." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "cellView": "both", "colab": {}, "colab_type": "code", "collapsed": true, "id": "hMqWDc_m6rUC" }, "outputs": [], "source": [ "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rHLcriKWLRe4" }, "source": [ " # Présentation rapide de Pandas - *version modifée*" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "QvJBqX8_Bctk" }, "source": [ "**Objectifs d'apprentissage :**\n", " * Introduction aux structures de données `DataFrame` et `Series` de la bibliothèque *Pandas*\n", " * Accéder aux données et les manipuler dans une structure `DataFrame` et `Series`\n", " * Importer des données d'un fichier CSV dans un `DataFrame` *Pandas*\n", " * Réindexer un `DataFrame` pour mélanger les données" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "TIFJ83ZTBctl" }, "source": [ " [*Pandas*](http://pandas.pydata.org/) est une API d'analyse de données orientée colonnes. C'est un excellent outil pour manipuler et analyser des données d'entrée. Beaucoup de frameworks d'apprentissage automatique acceptent les structures de données *Pandas* en entrée.\n", "Il faudrait des pages et des pages pour présenter de manière exhaustive l'API *Pandas*, mais les concepts fondamentaux sont relativement simples. Aussi, nous avons décidé de vous les exposer ci-dessous. Pour une description plus complète, vous pouvez consulter le [site de documentation de *Pandas*](http://pandas.pydata.org/pandas-docs/stable/index.html), sur lequel vous trouverez de multiples informations ainsi que de nombreux didacticiels." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "s_JOISVgmn9v" }, "source": [ " ## Concepts de base\n", "\n", "Les lignes de code suivantes permettent d'installer *matplotlib* et *pandas* " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install matplotlib\n", "%matplotlib inline\n", "!pip install pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La ligne de code suivante permet d'importer l'API *pandas* et d'afficher sa version :" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "id": "aSRYu62xUi3g", "outputId": "092dd1c9-f333-4bc3-b9a9-9848724b7f6b" }, "outputs": [ { "data": { "text/plain": [ "'0.24.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "pd.__version__" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "daQreKXIUslr" }, "source": [ " On distingue deux grandes catégories de structures de données *Pandas* :\n", "\n", " * Le **`DataFrame`**, un tableau relationnel de données, avec des lignes et des colonnes étiquetées\n", " * La **`Series`**, constituée d'une seule colonne. Un `DataFrame` contient une ou plusieurs `Series`, chacune étant étiquetée.\n", "\n", "Le DataFrame est une abstraction fréquemment utilisée pour manipuler des données. [Spark](https://spark.apache.org/) et [R](https://www.r-project.org/about.html) proposent des implémentations similaires." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "fjnAk1xcU0yc" }, "source": [ " Pour créer une `Series`, vous pouvez notamment créer un objet `Series`. Par exemple :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 88 }, "colab_type": "code", "id": "DFZ42Uq7UFDj", "outputId": "55107013-1e7c-4fdd-ba8f-5cafc9f66661" }, "outputs": [ { "data": { "text/plain": [ "0 San Francisco\n", "1 San Jose\n", "2 Sacramento\n", "dtype: object" ] }, "execution_count": 3, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "pd.Series(['San Francisco', 'San Jose', 'Sacramento'])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "U5ouUp1cU6pC" }, "source": [ " Il est possible de créer des objets `DataFrame` en transmettant un `dictionnaire` qui met en correspondance les noms de colonnes (des `chaînes de caractères`) avec leur `Series` respective. Lorsque la longueur de la `Series` ne correspond pas, les valeurs manquantes sont remplacées par des valeurs [NA/NaN](http://pandas.pydata.org/pandas-docs/stable/missing_data.html) spéciales. Exemple :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 143 }, "colab_type": "code", "id": "avgr6GfiUh8t", "outputId": "8a83a621-5c57-40f7-c247-72a265961910" }, "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", "
City namePopulation
0San Francisco852469
1San Jose1015785
2Sacramento485199
\n", "
" ], "text/plain": [ " City name Population\n", "0 San Francisco 852469\n", "1 San Jose 1015785\n", "2 Sacramento 485199" ] }, "execution_count": 4, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])\n", "population = pd.Series([852469, 1015785, 485199])\n", "\n", "pd.DataFrame({ 'City name': city_names, 'Population': population })" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oa5wfZT7VHJl" }, "source": [ " Le plus souvent, vous chargez un fichier entier dans un `DataFrame`. Dans l'exemple qui suit, le fichier chargé contient des données immobilières pour la Californie. Exécutez la cellule suivante pour charger les données et définir les caractéristiques :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 320 }, "colab_type": "code", "id": "av6RYOraVG1V", "outputId": "a7cac740-ed05-4806-a6b1-7412eca1f5a4" }, "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", "
longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
count17000.00000017000.00000017000.00000017000.00000017000.00000017000.00000017000.00000017000.00000017000.000000
mean-119.56210835.62522528.5893532643.664412539.4108241429.573941501.2219413.883578207300.912353
std2.0051662.13734012.5869372179.947071421.4994521147.852959384.5208411.908157115983.764387
min-124.35000032.5400001.0000002.0000001.0000003.0000001.0000000.49990014999.000000
25%-121.79000033.93000018.0000001462.000000297.000000790.000000282.0000002.566375119400.000000
50%-118.49000034.25000029.0000002127.000000434.0000001167.000000409.0000003.544600180400.000000
75%-118.00000037.72000037.0000003151.250000648.2500001721.000000605.2500004.767000265000.000000
max-114.31000041.95000052.00000037937.0000006445.00000035682.0000006082.00000015.000100500001.000000
\n", "
" ], "text/plain": [ " longitude latitude housing_median_age total_rooms \\\n", "count 17000.000000 17000.000000 17000.000000 17000.000000 \n", "mean -119.562108 35.625225 28.589353 2643.664412 \n", "std 2.005166 2.137340 12.586937 2179.947071 \n", "min -124.350000 32.540000 1.000000 2.000000 \n", "25% -121.790000 33.930000 18.000000 1462.000000 \n", "50% -118.490000 34.250000 29.000000 2127.000000 \n", "75% -118.000000 37.720000 37.000000 3151.250000 \n", "max -114.310000 41.950000 52.000000 37937.000000 \n", "\n", " total_bedrooms population households median_income \\\n", "count 17000.000000 17000.000000 17000.000000 17000.000000 \n", "mean 539.410824 1429.573941 501.221941 3.883578 \n", "std 421.499452 1147.852959 384.520841 1.908157 \n", "min 1.000000 3.000000 1.000000 0.499900 \n", "25% 297.000000 790.000000 282.000000 2.566375 \n", "50% 434.000000 1167.000000 409.000000 3.544600 \n", "75% 648.250000 1721.000000 605.250000 4.767000 \n", "max 6445.000000 35682.000000 6082.000000 15.000100 \n", "\n", " median_house_value \n", "count 17000.000000 \n", "mean 207300.912353 \n", "std 115983.764387 \n", "min 14999.000000 \n", "25% 119400.000000 \n", "50% 180400.000000 \n", "75% 265000.000000 \n", "max 500001.000000 " ] }, "execution_count": 5, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "california_housing_dataframe = pd.read_csv(\"https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv\", sep=\",\")\n", "california_housing_dataframe.describe()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WrkBjfz5kEQu" }, "source": [ " Dans l'exemple ci-dessus, la méthode `DataFrame.describe` permet d'afficher des statistiques intéressantes concernant un `DataFrame`. La fonction `DataFrame.head` est également utile pour afficher les premiers enregistrements d'un `DataFrame` :" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MRrd8TUGIIq6" }, "source": [ "Visualisation de données avec $\\texttt{Pandas}$ et $\\texttt{matplotlib}$" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 269 }, "colab_type": "code", "id": "Zf_sqrxjIXM2", "outputId": "a89ada41-31a5-4a60-da27-a307c33e4546" }, "outputs": [ { "data": { "image/png": "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\nz35PWlOLTz9b3z4vq7fV6qaael24cWe7vO2obWj9/P6SLTrO5e9/Rs3X37xSoos27Yr72xuaW9Tn\n8+sLs8pa988gv9+vSzbv0jfmb9LZpdX6zsLNuqu+UTdU1el7iypUVXXW2ipdsHGn3vPeMu09dLz6\nwva18PVNXbFdq/Y26Jj5m3Tc4i163O3j9f73V+hzH5e2fv/ehmZd7PLu8/nV7/erz+fXJ6au0U01\n9fppaZWOdctuqqnXmrpGrdyzX/3+wH790apKPf/R6dri8+vMtTv0w5XbdXZptf5u9CJ95bNyXVdZ\nq6qqVXsbtKR8p67cuqddPjfvrNeG5hZ9cVaZfrSqUldvq9WqvQ3t5mlq8Wm1Swvu3y0+v1bW7tc1\n22t1Z12j5/c3tfh0/Y69qho4Tt5bVKHNLT5ds71WG5t9+t6iitZtsN39nqq9Dbp2e61e+NgMXbO9\ntt369jY068bqeq3YtU9f+nSD7mtsibhPBfMW/huC22DW2irdWF2vD05a1fr9m3fW68bqep21tkp/\n8c95esVTn+gCt/9NXbFdt0Q5rt4s2azPz1yv//3CHN22e7+u37FXP11Xpe8s3KwVu/ZpZe1+3bZ7\nv/7zkzJ9fuZ63VBV126/A0o0gfOyaAE8yEJEzgLuU9VL3Oc7AFT1b9GW6devn5aUlOQoh8YY0zGI\nyAJV7RdvvkIpVpoP9BGR3iJyMHAVMC7PeTLGmE6rIJ4Ep6otInITMAXoAoxU1RV5zpYxxnRaBREc\nAFR1IjAx3/kwxhhTOMVKxhhjCogFB2OMMR4WHIwxxnhYcDDGGONhwcEYY4xHQXSCS4WI7AXW5Dsf\nURwFVOc7E1EUct6gsPNXyHmDws6f5S11mc7fcaoad9yWgmnKmoI1ifTyywcRKbG8paaQ81fIeYPC\nzp/lLXX5yp8VKxljjPGw4GCMMcajmIPDiHxnIAbLW+oKOX+FnDco7PxZ3lKXl/wVbYW0McaY7Cnm\nOwdjjDFZUnTBQUQGisgaESkVkaE5+s5jRWS6iKwUkRUicotL7yYiU0Vknfvb1aWLiDzp8rhURE4L\nWddgN/86ERmcwTx2EZFFIjLefe4tInNdHt5wQ6EjIoe4z6Vueq+Qddzh0teIyCUZzNsRIvKWiKwW\nkVUiclahbDsR+b37ny4XkddF5NB8bjsRGSkiO0RkeUhaxraViJwuIsvcMk+KSMLPMo2St0fc/3Wp\niLwrIkfE2ybRjuFo2z2d/IVM+6OIqIgc5T7nfdu59Jvd9lshIg+HpOd020WUyBOBCuVFYDjv9cDx\nwMHAEqBvDr63B3Cae/8FYC3QF3gYGOrShwIPufeXAZMAAfoDc116N6DM/e3q3nfNUB7/APwLGO8+\njwGucu+fBa53728AnnXvrwLecO/7uu15CNDbbecuGcrbKOB/3PuDgSMKYdsReBTtBuBzIdvs5/nc\ndsC5wGnA8pC0jG0rYJ6bV9yyl6aZt4uBA937h0LyFnGbEOMYjrbd08mfSz+WwOMANgJHFdC2Ox/4\nEDjEff5yvrZdxDxn4uDP1Qs4C5gS8vkO4I485GMscBGBTng9XFoPAn0vAJ4Drg6Zf42bfjXwXEh6\nu/nSyE9PYBowABjvdt7qkIO2dbu5g+Qs9/5AN5+Eb8vQ+dLM25cInIAlLD3v2462Z5d3c9tiPHBJ\nvrcd0CvsJJKRbeWmrQ5JbzdfKnkLm/ZD4DX3PuI2IcoxHGufTTd/wFvAt4By2oJD3rcdgRP6hRHm\ny8u2C38VW7FS8GAOqnBpOeOKEk4F5gJHq+o2N2k7cLR7Hy2f2cr/34HbAL/7fCSwW1VbInxPax7c\n9D1u/mzlrTdQBfxTAsVeL4jIYRTAtlPVLcCjwCZgG4FtsYDC2XZBmdpWx7j32crnLwlcUaeSt1j7\nbMpEZBCwRVWXhE0qhG33VeAcVxz0sYh8O8W8ZWXbFVtwyCsRORx4G/idqtaGTtNAyM550y8R+T6w\nQ1UX5Pq7E3QggdvpZ1T1VKCeQNFIqzxuu67AIAIB7P8BhwEDc52PZORrW8UjIncBLcBr+c5LkIh8\nHrgTuDffeYniQAJ3rf2BW4ExydRjZFuxBYctBMoPg3q6tKwTkYMIBIbXVPUdl1wpIj3c9B7Ajjj5\nzEb+zwb+Q0TKgdEEipb+FzhCRILDo4R+T2se3PQvATVZyhsErmIqVHWu+/wWgWBRCNvuQmCDqlap\najPwDoHtWSjbLihT22qLe5/RfIrIz4HvAz9zwSuVvNUQfbun6gQCgX+JOz56AgtF5N9SyF82tl0F\n8I4GzCNw539UCnnLxrYrujqHAwlUEPWmrULmpBx8rwAvA38PS3+E9hWFD7v3l9O+smueS+9GoPy9\nq3ttALplMJ/n0VYh/SbtK6hucO9vpH2l6hj3/iTaV4KVkbkK6VnA19z7+9x2y/u2A84EVgCfd983\nCrg539sOb9l0xrYV3krVy9LM20BgJdA9bL6I24QYx3C07Z5O/sKmldNW51AI2+43wP3u/VcJFBlJ\nvradJ7/priDXLwKtDNYSqLW/K0ff+V0Ct/JLgcXudRmBsr5pwDoCrQ6CO5EAT7k8LgP6hazrl0Cp\ne/0iw/k8j7bgcLzbmUvdjhNsEXGo+1zqph8fsvxdLs9rSKIlRgL5OgUocdvvPXfQFcS2A/4MrAaW\nA6+4AzJv2w54nUD9RzOBK8vrMrmtgH7ut64H/kFYQ4EU8lZK4KQWPC6ejbdNiHIMR9vu6eQvbHo5\nbcGhELbdwcCrbp0LgQH52naRXtZD2hhjjEex1TkYY4zJAQsOxhhjPCw4GGOM8bDgYIwxxsOCgzHG\nGA8LDsYYYzwsOBhjjPGw4GCMMcbj/wN9lsngcewIpwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "california_housing_dataframe.population.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "colab_type": "code", "id": "s3ND3bgOkB5k", "outputId": "12fe1fdb-638a-475b-bd46-20e67e094ad3" }, "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", "
longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
0-114.3134.1915.05612.01283.01015.0472.01.493666900.0
1-114.4734.4019.07650.01901.01129.0463.01.820080100.0
2-114.5633.6917.0720.0174.0333.0117.01.650985700.0
3-114.5733.6414.01501.0337.0515.0226.03.191773400.0
4-114.5733.5720.01454.0326.0624.0262.01.925065500.0
\n", "
" ], "text/plain": [ " longitude latitude housing_median_age total_rooms total_bedrooms \\\n", "0 -114.31 34.19 15.0 5612.0 1283.0 \n", "1 -114.47 34.40 19.0 7650.0 1901.0 \n", "2 -114.56 33.69 17.0 720.0 174.0 \n", "3 -114.57 33.64 14.0 1501.0 337.0 \n", "4 -114.57 33.57 20.0 1454.0 326.0 \n", "\n", " population households median_income median_house_value \n", "0 1015.0 472.0 1.4936 66900.0 \n", "1 1129.0 463.0 1.8200 80100.0 \n", "2 333.0 117.0 1.6509 85700.0 \n", "3 515.0 226.0 3.1917 73400.0 \n", "4 624.0 262.0 1.9250 65500.0 " ] }, "execution_count": 8, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "california_housing_dataframe.head()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "w9-Es5Y6laGd" }, "source": [ " Autre fonction puissante de *Pandas* : la représentation graphique. Avec `DataFrame.hist`, par exemple, vous pouvez vérifier rapidement la façon dont les valeurs d'une colonne sont distribuées :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 317 }, "colab_type": "code", "id": "nqndFVXVlbPN", "outputId": "152fdbe2-1ec2-41d0-d9fb-01f5b4444643" }, "outputs": [ { "data": { "text/plain": [ "array([[]],\n", " dtype=object)" ] }, "execution_count": 9, "metadata": { "tags": [] }, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "california_housing_dataframe.hist('housing_median_age')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "XtYZ7114n3b-" }, "source": [ " ## Accéder aux données\n", "\n", "L'accès aux données d'un `DataFrame` s'effectue au moyen d'opérations de liste ou de dictionnaire Python courantes :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 106 }, "colab_type": "code", "id": "_TFm7-looBFF", "outputId": "dcc736f0-4120-4a1d-9a62-4370fba02a13" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/plain": [ "0 San Francisco\n", "1 San Jose\n", "2 Sacramento\n", "Name: City name, dtype: object" ] }, "execution_count": 10, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "cities = pd.DataFrame({ 'City name': city_names, 'Population': population })\n", "print(type(cities['City name']))\n", "cities['City name']" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 53 }, "colab_type": "code", "id": "V5L6xacLoxyv", "outputId": "3f2a530e-394c-4dca-9832-3dfb9f52b376" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/plain": [ "'San Jose'" ] }, "execution_count": 11, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "print(type(cities['City name'][1]))\n", "cities['City name'][1]" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 130 }, "colab_type": "code", "id": "gcYX1tBPugZl", "outputId": "7c2a1230-1914-48a6-95e4-81728f506da1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\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", "
City namePopulation
0San Francisco852469
1San Jose1015785
\n", "
" ], "text/plain": [ " City name Population\n", "0 San Francisco 852469\n", "1 San Jose 1015785" ] }, "execution_count": 12, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "print(type(cities[0:2]))\n", "cities[0:2]" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "65g1ZdGVjXsQ" }, "source": [ " *Pandas* propose en outre une API extrêmement riche, avec des fonctions avancées d'[indexation et de sélection](http://pandas.pydata.org/pandas-docs/stable/indexing.html), que nous ne pouvons malheureusement pas aborder ici dans le détail." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RM1iaD-ka3Y1" }, "source": [ " ## Manipuler des données\n", "\n", "Il est possible d'effectuer des opérations arithmétiques de base de Python sur les `Series`. Par exemple :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 88 }, "colab_type": "code", "id": "XWmyCFJ5bOv-", "outputId": "5c0f7d56-3779-4593-ab20-5c618313fa4a" }, "outputs": [ { "data": { "text/plain": [ "0 852.469\n", "1 1015.785\n", "2 485.199\n", "dtype: float64" ] }, "execution_count": 13, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "population / 1000." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "TQzIVnbnmWGM" }, "source": [ " [NumPy](http://www.numpy.org/) est un kit d'outils de calculs scientifiques populaire. Les `Series` *Pandas* peuvent faire office d'arguments pour la plupart des fonctions NumPy :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "ko6pLK6JmkYP" }, "outputs": [], "source": [ "import numpy as np\n", "\n", "np.log(population)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xmxFuQmurr6d" }, "source": [ " La méthode `Series.apply` convient pour les transformations à une colonne plus complexes. Comme la [fonction `map`](https://docs.python.org/2/library/functions.html#map) de Python, elle accepte en argument une [fonction `lambda`](https://docs.python.org/2/tutorial/controlflow.html#lambda-expressions), appliquée à chaque valeur.\n", "\n", "L'exemple ci-dessous permet de créer une `Series` signalant si la `population` dépasse ou non un million d'habitants :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 88 }, "colab_type": "code", "id": "Fc1DvPAbstjI", "outputId": "8a1cd4e7-c299-4e02-a592-092743858b1a" }, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 True\n", "2 False\n", "dtype: bool" ] }, "execution_count": 14, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "population.apply(lambda val: val > 1000000)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ZeYYLoV9b9fB" }, "source": [ " \n", "La modification des `DataFrames` est également très simple. Ainsi, le code suivant permet d'ajouter deux `Series` à un `DataFrame` existant :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 143 }, "colab_type": "code", "id": "0gCEX99Hb8LR", "outputId": "d2ef5874-d75f-4f5c-aa7d-3bfda406a4ad" }, "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", "
City namePopulationArea square milesPopulation density
0San Francisco85246946.8718187.945381
1San Jose1015785176.535754.177760
2Sacramento48519997.924955.055147
\n", "
" ], "text/plain": [ " City name Population Area square miles Population density\n", "0 San Francisco 852469 46.87 18187.945381\n", "1 San Jose 1015785 176.53 5754.177760\n", "2 Sacramento 485199 97.92 4955.055147" ] }, "execution_count": 15, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92])\n", "cities['Population density'] = cities['Population'] / cities['Area square miles']\n", "cities" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6qh63m-ayb-c" }, "source": [ " ## Exercice n° 1\n", "\n", "Modifiez le tableau `cities` en ajoutant une colonne booléenne qui prend la valeur True si et seulement si les *deux* conditions suivantes sont remplies :\n", "\n", " * La ville porte le nom d'un saint.\n", " * La ville s'étend sur plus de 50 miles carrés.\n", "\n", "**Remarque** : Pour combiner des `Series` booléennes, utilisez des opérateurs de bits, pas les opérateurs booléens classiques. Par exemple, pour le *ET logique*, utilisez `&` au lieu de `and`.\n", "\n", "**Astuce** : En espagnol, \"San\" signifie \"saint\"." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "zCOn8ftSyddH" }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YHIWvc9Ms-Ll" }, "source": [ " ### Solution\n", "\n", "Cliquez ci-dessous pour afficher la solution." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "T5OlrqtdtCIb" }, "outputs": [], "source": [ "cities['Is wide and has saint name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('San'))\n", "cities" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "f-xAOJeMiXFB" }, "source": [ " ## Index\n", "Les objets `Series` et `DataFrame` définissent également une propriété `index`, qui affecte un identifiant à chaque élément d'une `Series` ou chaque ligne d'un `DataFrame`. \n", "\n", "Par défaut, *Pandas* affecte les valeurs d'index en suivant l'ordre des données source. Ces valeurs ne varient pas par la suite ; elles restent inchangées en cas de réagencement des données." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "2684gsWNinq9" }, "outputs": [], "source": [ "city_names.index" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "F_qPe2TBjfWd" }, "outputs": [], "source": [ "cities.index" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hp2oWY9Slo_h" }, "source": [ " Appelez `DataFrame.reindex` pour réorganiser manuellement les lignes. Le code suivant, par exemple, revient à trier les données par nom de ville :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "sN0zUzSAj-U1" }, "outputs": [], "source": [ "cities.reindex([2, 0, 1])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-GQFz8NZuS06" }, "source": [ " La réindexation est un excellent moyen de mélanger (organiser aléatoirement) les données d'un `DataFrame`. Dans l'exemple ci-dessous, l'index de type tableau est transmis à la fonction NumPy `random.permutation`, qui mélange les valeurs. En appelant `reindex` avec ce tableau mélangé, nous mélangeons également les lignes du `DataFrame`.\n", "Exécutez plusieurs fois la cellule suivante !" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "mF8GC0k8uYhz" }, "outputs": [], "source": [ "cities.reindex(np.random.permutation(cities.index))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "fSso35fQmGKb" }, "source": [ " Pour en savoir plus, consultez la [documentation relative aux index](http://pandas.pydata.org/pandas-docs/stable/indexing.html#index-objects)." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8UngIdVhz8C0" }, "source": [ " ## Exercice n° 2\n", "\n", "La méthode `reindex` autorise les valeurs d'index autres que celles associées au `DataFrame` d'origine. Voyez ce qu'il se passe lorsque vous utilisez ce type de valeurs ! Pourquoi est-ce autorisé à votre avis ?" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "PN55GrDX0jzO" }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "TJffr5_Jwqvd" }, "source": [ " ### Solution\n", "\n", "Cliquez ci-dessous pour afficher la solution." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8oSvi2QWwuDH" }, "source": [ " Lorsque le tableau d'entrée `reindex` contient des valeurs d'index ne faisant pas partie de la liste des index du `DataFrame` d'origine, `reindex` ajoute des lignes pour ces index \\'manquants\\' et insère la valeur `NaN` dans les colonnes correspondantes :" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "collapsed": true, "id": "yBdkucKCwy4x" }, "outputs": [], "source": [ "cities.reindex([0, 4, 5, 2])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2l82PhPbwz7g" }, "source": [ " Ce comportement est souhaitable, car les index sont souvent des chaînes de caractères extraites des données réelles. La [documentation *Pandas* sur la fonction `reindex`](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html) inclut un exemple avec des noms de navigateurs comme valeurs d'index).\n", "\n", "Dans ce cas, autoriser les index \\'manquants\\' facilite la réindexation à l'aide d'une liste externe, car vous n'avez pas à vous préoccuper de l'intégrité des données d'entrée." ] } ], "metadata": { "colab": { "collapsed_sections": [ "JndnmDMp66FL", "YHIWvc9Ms-Ll", "TJffr5_Jwqvd" ], "include_colab_link": true, "name": "Copie de intro_to_pandas.ipynb", "provenance": [], "version": "0.3.2" }, "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.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }