{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " \n", " \"Open\n", " \n", "
\n", "
\n", "

\n", " 💡 Si el botó no funciona: Copia i enganxa aquesta URL al teu navegador:
\n", " \n", "https://colab.research.google.com/github/wisaaco/TallerPythonFEE/blob/main/notebooks/3_PandasSeleccio.ipynb\n", " \n", "

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "# Unitat 3. Estructura del dataframe\n", "\n", "Ara que ja sabem carregar dataframes de fitxers, descobrirem com podem accedir a l'informació que es troba dins de l'estructura de dades.\n", "\n", "Començarem seleccionant columnes i obtenint resums estadístics d'elles. Més endavant passarem a fer seleccions de files del dataframe. Finalment, realitzarem seleccions combinades creant els nostres propis dataframes a partir dels subconjunts seleccionats." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#Seguirem emprant la llibreria pandas i el dataset WHO\n", "\n", "import pandas as pd\n", "\n", "df_who = pd.read_csv(\"http://www.exploredata.net/ftp/WHO.csv\") # carregam un dataframe" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Columnes\n", "\n", "Com hem comentat a l'introducció, començarem fent feina amb les columnes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Columnes o caracteristiques de cada mostra\n", "print(df_who.columns)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for col in df_who.columns:\n", " print(col)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Ja coneixem els dataframes, la segona estructura de dades que més empram a Pandas és la serie:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who[\"Country\"]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Un cop seleccionam una columna podem accedir als seus elements com si fossin una llista:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(df_who[\"Country\"][0])\n", "print(\"-\"*30)\n", "print(df_who[\"Country\"][:5])\n", "print(\"-\"*30)\n", "print(df_who[\"Country\"].values)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ " Existeix una altra manera més simple de seleccionar una única columna, ja que podem trobar noms de columnes molt llargs: \"Children aged <5 years who received any antimalarial treatment for fever (%)\"\n", "\n", "**Nota**: Per tant, en la creació de documents és important un adequat nom de columnes!!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.Country" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [], "source": [ "print(df_who.columns[9])\n", "print(\"-\"*30)\n", "print(df_who[df_who.columns[9]])\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Aquí també podem emprar l'*slicing*, per seleccionar múltiples columnes." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "df_who[df_who.columns[0:5]]\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "I també podem seleccionar diverses columnes si coneixem el seu nom, veiem que Pandas és molt flexible:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who[[\"CountryID\",\"Continent\"]]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "### Estadístics\n", "\n", "En seleccionar una columna d'un dataframe obtenim una sèrie. Podem obtenir estadístics d'aquesta sèrie de manera molt senzilla:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "fertilitat = df_who[df_who.columns[3]]\n", "print(\"Min \", fertilitat.min())\n", "print(\"Max \", fertilitat.max())\n", "print(\"Mean \", fertilitat.mean())" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "A continuació trobareu la taula que mostra les funcions descriptives que tenim disponibles:\n", "\n", "\n", "Veurem que obtenir aquestes informacions estadístiques ens pot ajudar a extreure informació molt concreta de la taula, per exemple, si volem saber:\n", "\n", "**¿Quin pais té la major emissió de CO2 ?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "co2 = df_who[\"Total_CO2_emissions\"]\n", "row = df_who[co2 == co2.max()] # Selecció condicionada\n", "type(row)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "La variable row conté la fila amb el valor màxim a la columna \"Total_CO2_emissions\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(row[\"Country\"])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "row[\"Country\"].values" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(\"El pais mas contaminante es: \", row[\"Country\"].values[0])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Files\n", "\n", "Cada fila té un índex. L'índex pot ser numèric, alfabètic o de temps." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.index" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.index.values" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "### El mètode `loc`\n", "\n", "Emprant el mètode `loc` del dataframe podem accedir a les seves files amb la mateixa lògica que ja coneixem per les llistes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.loc[0] #la mostra zero, primera fila" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(df_who.loc[0]) # una fila també és una sèrie" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(df_who.loc[0].Country) # Podem accedir a una sèrie amb el seu índex\n", "print(df_who.loc[0][0]) #o amb la seva posició\n", "print(df_who.loc[0][3])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Com passava amb les llistes també podem seleccionar diversos elements (files) en una sola comanda usant la tècnica de _slicing_." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.loc[166:170] #slicing" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Els índexs són útils quan són dates: Sèries temporals\n", "# per exemple:\n", "# df.loc[\"2020\":\"2022\"]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "### Selecció condicional\n", "\n", "Si volem que la nostra selecció es correspongui amb un criteri lògic, per exemple saber quins són els països amb una taxa d'alfabetització dels adults amb més d'un 70% podem fer el següent:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "alfabetitzacio = df_who[df_who['Adult literacy rate (%)'] > 70][[\"Country\",\"Adult literacy rate (%)\"]]\n", "\n", "alfabetitzacio[alfabetitzacio[\"Country\"] == \"Italy\"]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "L'estructura d'aquest tipus de selecció sembla complexa, però si la dividim en parts veurem que és abordable:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# En aquest codi obtenim una llista de valors booleans (True o False) segons és compleix la condició per cada una de les files:\n", "seleccio = df_who['Adult literacy rate (%)'] > 70" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# En aquest codi, de les files on seleccio == True agafam les dues columnes que ens interessen\n", "df_who[seleccio][[\"Country\",\"Adult literacy rate (%)\"]]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Aquest tipus de selecció ens obre tot un nou ventall de possibilitats de selecció \"automàtica\" de dades que fins ara es feia molt complicat.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Files i columnes\n", "\n", "Obviament, si sabem seleccionar files i columnes, podem combinar-les per fer una selecció més específica." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "df_who.loc[167:169, [\"Country\",\"Total_CO2_emissions\"]] # per noms" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "### El mètode *iloc*\n", "No sempre ens serà còmode fer seleccions amb els noms de les files (encara que normalment siguin nombres) i de les columnes. Si volem fer seleccions emprant només els índexs podem emprar el mètode `.iloc[files, columnes]`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_who.iloc[[168,192],[0,43,118]] # per posicions" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Activitat\n", "\n", "En aquesta activitat practicarem la selecció de dades (columnes i files) en un dataframe" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**1) Quina és la mitjana de la població urbana (\"Urban_population\") de tots els països? La seva desviació típica (std)?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**2) Consulta la fila del país: “Spain”**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**3a) Quin país té una població urbana més gran?**\n", "**3b) Quins països tenen una població urbana menor a 50.000 ?**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**4) El continent on està situat Spain és el mateix que el d'UnitedStates?**\n", "\n", "Utilitza una condició per obtenir un resultat Booleà (*True* o *False*)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**5) Quins són els cinc països més contaminants (\"Total_CO2_emissions\")?**\n", "\n", "Aquesta és la meva [pista per a una solució elegant](http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.sort_values.html)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "**6) Observant algunes mostres del fitxer pots establir la relació entre l'identificador del continent i el seu nom?**\n", "\n", "És a dir, sabem que Spain és al continent Europeu i el codi del continent és el 2.\n", "\n", "Hi ha els codis de continents: 1, 2, 3, 4, 5, 6, 7\n", "\n", "**Nota:** Hi ha dos codis associats a Àsia.\n", "\n", "Fes les consultes pertinents al dataframe per construir un diccionari amb la següent" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "codigoContinentes = {1:\"Asia\",2:\"Europa\"} #Al menos hay 7!\n", "print(codigoContinentes[2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "codigoContinentes[3] = \"\"\n", "codigoContinentes[4] = \"\"\n", "codigoContinentes[5] = \"\"\n", "codigoContinentes[6] = \"\"\n", "codigoContinentes[7] = \"\"" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "[![License: CC BY 4.0](https://img.shields.io/badge/License-CC_BY_4.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/)
\n", "Isaac Lera and Gabriel Moya
\n", "Universitat de les Illes Balears
\n", "isaac.lera@uib.edu, gabriel.moya@uib.edu" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "my3110", "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.11.0" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }