{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![](https://raw.githubusercontent.com/rafneta/CienciaDatosPythonCIDE/master/imagenes/banner.png)\n", "\n", "```{contents}\n", ":depth: 4\n", "```\n", "\n", "# Pandas\n", "\n", "## ¿A que nos sirve?\n", "\n", "Con Pandas podemos manejar nuestros datos, **modificandolos**, **transformandolos** y **analizandolos**.\n", "\n", "En particular podemos:\n", "* limpiar los datos presentes en un DataFrame\n", "* Visualizar los datos con la ayuda de Matplotlib\n", "* Almacenar los datos trasformados en otro archivo CSV\n", "\n", "Panda está construido con base en Numpy y normalmente su output preferido es **Scipy** o **Scikit-learn**. \n", "\n", "Antes que todo tendremos que importar los paquetes:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Merge and append\n", "\n", "Una de las cosas que utilizaremos más cuando harémos data cleaning es juntar data frame así de poder obtener una base más funcional. Para hacer esto tenemos diferentes funciones con Python.\n", "\n", "![](join.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de ver los Join analizaremos como podemos concatenar data frames:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
0A4B4C4D4
1A5B5C5D5
2A6B6C6D6
3A7B7C7D7
8A8B8C8D8
9A9B9C9D9
10A10B10C10D10
11A11B11C11D11
\n", "
" ], "text/plain": [ " A B C D\n", "0 A0 B0 C0 D0\n", "1 A1 B1 C1 D1\n", "2 A2 B2 C2 D2\n", "3 A3 B3 C3 D3\n", "0 A4 B4 C4 D4\n", "1 A5 B5 C5 D5\n", "2 A6 B6 C6 D6\n", "3 A7 B7 C7 D7\n", "8 A8 B8 C8 D8\n", "9 A9 B9 C9 D9\n", "10 A10 B10 C10 D10\n", "11 A11 B11 C11 D11" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ " df1 = pd.DataFrame(\n", " {\n", " \"A\": [\"A0\", \"A1\", \"A2\", \"A3\"],\n", " \"B\": [\"B0\", \"B1\", \"B2\", \"B3\"],\n", " \"C\": [\"C0\", \"C1\", \"C2\", \"C3\"],\n", " \"D\": [\"D0\", \"D1\", \"D2\", \"D3\"],\n", " },\n", " index=[0, 1, 2, 3],\n", " )\n", "\n", "\n", "df2 = pd.DataFrame(\n", " {\n", " \"A\": [\"A4\", \"A5\", \"A6\", \"A7\"],\n", " \"B\": [\"B4\", \"B5\", \"B6\", \"B7\"],\n", " \"C\": [\"C4\", \"C5\", \"C6\", \"C7\"],\n", " \"D\": [\"D4\", \"D5\", \"D6\", \"D7\"],\n", " },\n", " )\n", " \n", "\n", "df3 = pd.DataFrame(\n", " {\n", " \"A\": [\"A8\", \"A9\", \"A10\", \"A11\"],\n", " \"B\": [\"B8\", \"B9\", \"B10\", \"B11\"],\n", " \"C\": [\"C8\", \"C9\", \"C10\", \"C11\"],\n", " \"D\": [\"D8\", \"D9\", \"D10\", \"D11\"],\n", " },\n", " index=[8, 9, 10, 11],\n", " )\n", " \n", "\n", "frames = [df1, df2, df3]\n", "\n", "result = pd.concat(frames)\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nuestra función tiene las siguientes propriedades:\n", " \n", "pd.concat(\n", " objs,\n", " axis=0,\n", " join=\"outer\",\n", " ignore_index=False,\n", " keys=None,\n", " levels=None,\n", " names=None,\n", " verify_integrity=False,\n", " copy=True,\n", ") " ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
x0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
y0A4B4C4D4
1A5B5C5D5
2A6B6C6D6
3A7B7C7D7
z8A8B8C8D8
9A9B9C9D9
10A10B10C10D10
11A11B11C11D11
\n", "
" ], "text/plain": [ " A B C D\n", "x 0 A0 B0 C0 D0\n", " 1 A1 B1 C1 D1\n", " 2 A2 B2 C2 D2\n", " 3 A3 B3 C3 D3\n", "y 0 A4 B4 C4 D4\n", " 1 A5 B5 C5 D5\n", " 2 A6 B6 C6 D6\n", " 3 A7 B7 C7 D7\n", "z 8 A8 B8 C8 D8\n", " 9 A9 B9 C9 D9\n", " 10 A10 B10 C10 D10\n", " 11 A11 B11 C11 D11" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.concat(frames, keys=[\"x\", \"y\", \"z\"])\n", " \n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tendremos por lo tanto un objecto con un idnice jerarquizado:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A4B4C4D4
1A5B5C5D5
2A6B6C6D6
3A7B7C7D7
\n", "
" ], "text/plain": [ " A B C D\n", "0 A4 B4 C4 D4\n", "1 A5 B5 C5 D5\n", "2 A6 B6 C6 D6\n", "3 A7 B7 C7 D7" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.loc[\"y\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos tambien definir el eje de donde queremos hacer el appen y decidir si queremos la union (join=outer) o la interseccion (join=inner):" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [], "source": [ "df4 = pd.DataFrame(\n", " {\n", " \"B\": [\"B2\", \"B3\", \"B6\", \"B7\"],\n", " \"D\": [\"D2\", \"D3\", \"D6\", \"D7\"],\n", " \"F\": [\"F2\", \"F3\", \"F6\", \"F7\"],\n", " },\n", " index=[2, 3, 6, 7],\n", " )" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDBDF
0A0B0C0D0NaNNaNNaN
1A1B1C1D1NaNNaNNaN
2A2B2C2D2B2D2F2
3A3B3C3D3B3D3F3
6NaNNaNNaNNaNB6D6F6
7NaNNaNNaNNaNB7D7F7
\n", "
" ], "text/plain": [ " A B C D B D F\n", "0 A0 B0 C0 D0 NaN NaN NaN\n", "1 A1 B1 C1 D1 NaN NaN NaN\n", "2 A2 B2 C2 D2 B2 D2 F2\n", "3 A3 B3 C3 D3 B3 D3 F3\n", "6 NaN NaN NaN NaN B6 D6 F6\n", "7 NaN NaN NaN NaN B7 D7 F7" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.concat([df1, df4], axis=1)\n", "\n", "result" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDBDF
2A2B2C2D2B2D2F2
3A3B3C3D3B3D3F3
\n", "
" ], "text/plain": [ " A B C D B D F\n", "2 A2 B2 C2 D2 B2 D2 F2\n", "3 A3 B3 C3 D3 B3 D3 F3" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.concat([df1, df4], axis=1, join=\"inner\")\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para concatenar podemos utilizar tambien el append, de hecho era una función antes del concat y funciona solo pr el eje 0, nuestros renglones:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
0A4B4C4D4
1A5B5C5D5
2A6B6C6D6
3A7B7C7D7
\n", "
" ], "text/plain": [ " A B C D\n", "0 A0 B0 C0 D0\n", "1 A1 B1 C1 D1\n", "2 A2 B2 C2 D2\n", "3 A3 B3 C3 D3\n", "0 A4 B4 C4 D4\n", "1 A5 B5 C5 D5\n", "2 A6 B6 C6 D6\n", "3 A7 B7 C7 D7" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = df1.append(df2)\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¿Qué pasa si hacemos un append de los siguientes dataframes?" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
\n", "
" ], "text/plain": [ " A B C D\n", "0 A0 B0 C0 D0\n", "1 A1 B1 C1 D1\n", "2 A2 B2 C2 D2\n", "3 A3 B3 C3 D3" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BDF
2B2D2F2
3B3D3F3
6B6D6F6
7B7D7F7
\n", "
" ], "text/plain": [ " B D F\n", "2 B2 D2 F2\n", "3 B3 D3 F3\n", "6 B6 D6 F6\n", "7 B7 D7 F7" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
0A0B0C0D0NaN
1A1B1C1D1NaN
2A2B2C2D2NaN
3A3B3C3D3NaN
2NaNB2NaND2F2
3NaNB3NaND3F3
6NaNB6NaND6F6
7NaNB7NaND7F7
\n", "
" ], "text/plain": [ " A B C D F\n", "0 A0 B0 C0 D0 NaN\n", "1 A1 B1 C1 D1 NaN\n", "2 A2 B2 C2 D2 NaN\n", "3 A3 B3 C3 D3 NaN\n", "2 NaN B2 NaN D2 F2\n", "3 NaN B3 NaN D3 F3\n", "6 NaN B6 NaN D6 F6\n", "7 NaN B7 NaN D7 F7" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = df1.append(df4, sort=False)\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos hacer append de multiples dataframe a la vez:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
0A4B4C4D4
1A5B5C5D5
2A6B6C6D6
3A7B7C7D7
8A8B8C8D8
9A9B9C9D9
10A10B10C10D10
11A11B11C11D11
\n", "
" ], "text/plain": [ " A B C D\n", "0 A0 B0 C0 D0\n", "1 A1 B1 C1 D1\n", "2 A2 B2 C2 D2\n", "3 A3 B3 C3 D3\n", "0 A4 B4 C4 D4\n", "1 A5 B5 C5 D5\n", "2 A6 B6 C6 D6\n", "3 A7 B7 C7 D7\n", "8 A8 B8 C8 D8\n", "9 A9 B9 C9 D9\n", "10 A10 B10 C10 D10\n", "11 A11 B11 C11 D11" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = df1.append([df2, df3])\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Más tipos de concatenación](https://pandas.pydata.org/docs/user_guide/merging.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Merge\n", "\n", "\n", "Pandas nos permite de juntar dataframe de manera computacionalmente eficaz con una sintaxis similar a la de SQL. Resulta mucho más eficaz que otros lenguajes como R. Tenemos una unica función atraves de la cual, especificando los distintos argumentos, podemos obtener los diferentes join:\n", "\n", "![](join.jpg)\n", "\n", "\n", "pd.merge(\n", " left,\n", " right,\n", " how=\"inner\",\n", " on=None,\n", " left_on=None,\n", " right_on=None,\n", " left_index=False,\n", " right_index=False,\n", " sort=True,\n", " suffixes=(\"_x\", \"_y\"),\n", " copy=True,\n", " indicator=False,\n", " validate=None,\n", ")\n", "\n", "Uno de los conceptos principales es el tipo de relación que tenemos entre las llaves de los distintos data frames:\n", "\n", "* 1:1: juntamos los dos data frames por medio de una llave que debe ser unica\n", "\n", "* m:1: la llave unica es presente solo en el segundo data frame, en el primero puede ser repetida\n", "\n", "* m:m: el join viene efectuado sobre columna, si la llave que nos sirve para juntar los data frames es repetida obtendremos un producto cartesiano de los dos data frames" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [], "source": [ "left = pd.DataFrame(\n", " {\n", " \"key\": [\"K0\", \"K1\", \"K2\", \"K3\"],\n", " \"A\": [\"A0\", \"A1\", \"A2\", \"A3\"],\n", " \"B\": [\"B0\", \"B1\", \"B2\", \"B3\"],\n", " }\n", " )\n", "\n", "right = pd.DataFrame(\n", " {\n", " \"key\": [\"K0\", \"K1\", \"K2\", \"K3\"],\n", " \"C\": [\"C0\", \"C1\", \"C2\", \"C3\"],\n", " \"D\": [\"D0\", \"D1\", \"D2\", \"D3\"],\n", " }\n", " )" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyAB
0K0A0B0
1K1A1B1
2K2A2B2
3K3A3B3
\n", "
" ], "text/plain": [ " key A B\n", "0 K0 A0 B0\n", "1 K1 A1 B1\n", "2 K2 A2 B2\n", "3 K3 A3 B3" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyCD
0K0C0D0
1K1C1D1
2K2C2D2
3K3C3D3
\n", "
" ], "text/plain": [ " key C D\n", "0 K0 C0 D0\n", "1 K1 C1 D1\n", "2 K2 C2 D2\n", "3 K3 C3 D3" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyABCD
0K0A0B0C0D0
1K1A1B1C1D1
2K2A2B2C2D2
3K3A3B3C3D3
\n", "
" ], "text/plain": [ " key A B C D\n", "0 K0 A0 B0 C0 D0\n", "1 K1 A1 B1 C1 D1\n", "2 K2 A2 B2 C2 D2\n", "3 K3 A3 B3 C3 D3" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, on=\"key\")\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos tener llaves multiples:" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [], "source": [ "left = pd.DataFrame(\n", " {\n", " \"key1\": [\"K0\", \"K0\", \"K1\", \"K2\"],\n", " \"key2\": [\"K0\", \"K1\", \"K0\", \"K1\"],\n", " \"A\": [\"A0\", \"A1\", \"A2\", \"A3\"],\n", " \"B\": [\"B0\", \"B1\", \"B2\", \"B3\"],\n", " }\n", " )\n", " \n", "\n", "right = pd.DataFrame(\n", " {\n", " \"key1\": [\"K0\", \"K1\", \"K1\", \"K2\"],\n", " \"key2\": [\"K0\", \"K0\", \"K0\", \"K0\"],\n", " \"C\": [\"C0\", \"C1\", \"C2\", \"C3\"],\n", " \"D\": [\"D0\", \"D1\", \"D2\", \"D3\"],\n", " }\n", " )\n", " " ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2AB
0K0K0A0B0
1K0K1A1B1
2K1K0A2B2
3K2K1A3B3
\n", "
" ], "text/plain": [ " key1 key2 A B\n", "0 K0 K0 A0 B0\n", "1 K0 K1 A1 B1\n", "2 K1 K0 A2 B2\n", "3 K2 K1 A3 B3" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2CD
0K0K0C0D0
1K1K0C1D1
2K1K0C2D2
3K2K0C3D3
\n", "
" ], "text/plain": [ " key1 key2 C D\n", "0 K0 K0 C0 D0\n", "1 K1 K0 C1 D1\n", "2 K1 K0 C2 D2\n", "3 K2 K0 C3 D3" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
\n", "
" ], "text/plain": [ " key1 key2 A B C D\n", "0 K0 K0 A0 B0 C0 D0\n", "1 K1 K0 A2 B2 C1 D1\n", "2 K1 K0 A2 B2 C2 D2" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, )on=[\"key1\", \"key2\"]\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tipos Join\n", "\n", "En el argumento *how* podemos especificar que tipo de join queremos efectuar:\n", "\n", "* left: left outer join, utilizamos las llaves del df de la izquierda\n", "* right: right outer join, utilizamos las llaves del df de la derecha\n", "* outer:utilizamos la union de las llaves de ambos df\n", "* inner: utilizamos la intersección entre las dos llaves\n" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
\n", "
" ], "text/plain": [ " key1 key2 A B C D\n", "0 K0 K0 A0 B0 C0 D0\n", "1 K0 K1 A1 B1 NaN NaN\n", "2 K1 K0 A2 B2 C1 D1\n", "3 K1 K0 A2 B2 C2 D2\n", "4 K2 K1 A3 B3 NaN NaN" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, how=\"left\", on=[\"key1\", \"key2\"])\n", "result" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
3K2K0NaNNaNC3D3
\n", "
" ], "text/plain": [ " key1 key2 A B C D\n", "0 K0 K0 A0 B0 C0 D0\n", "1 K1 K0 A2 B2 C1 D1\n", "2 K1 K0 A2 B2 C2 D2\n", "3 K2 K0 NaN NaN C3 D3" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, how=\"right\", on=[\"key1\", \"key2\"])\n", "result" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
5K2K0NaNNaNC3D3
\n", "
" ], "text/plain": [ " key1 key2 A B C D\n", "0 K0 K0 A0 B0 C0 D0\n", "1 K0 K1 A1 B1 NaN NaN\n", "2 K1 K0 A2 B2 C1 D1\n", "3 K1 K0 A2 B2 C2 D2\n", "4 K2 K1 A3 B3 NaN NaN\n", "5 K2 K0 NaN NaN C3 D3" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, how=\"outer\", on=[\"key1\", \"key2\"])\n", "result" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
\n", "
" ], "text/plain": [ " key1 key2 A B C D\n", "0 K0 K0 A0 B0 C0 D0\n", "1 K1 K0 A2 B2 C1 D1\n", "2 K1 K0 A2 B2 C2 D2" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = pd.merge(left, right, how=\"inner\", on=[\"key1\", \"key2\"])\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tenemos que estar cuidados cuando tenemos indices multiples " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SQL\n", "\n", "### ¿Qué es SQL?\n", "\n", "* SQL son las siglas de Structured Query Language\n", "* SQL permite acceder y manipular bases de datos\n", "* SQL se convirtió en un estándar del American National Standards Institute (ANSI) en 1986, y de la International Organization for Standardization (ISO) en 1987. \n", "* A pesar de ser estándar hay diferentes \"mutaciones\" de SQL\n", "\n", "### ¿Qué podemos hacer con SQL?\n", "\n", "* ejecutar consultas en una base de datos\n", "* recuperar datos de una base de datos\n", "* insertar registros en una base de datos\n", "* actualizar registros en una base de datos\n", "* eliminar registros de una base de datos\n", "* crear nuevas bases de datos\n", "* crear nuevas tablas en una base de datos\n", "* crear procedimientos almacenados en una base de datos\n", "* crear vistas en una base de datos\n", "* establecer permisos en tablas, procedimientos y vistas \n", "\n", "### RDBMS\n", "\n", "RDBMS son las siglas de Relational Database Management System.\n", "\n", "RDBMS es la base de SQL y de todos los sistemas de bases de datos modernos como MS SQL Server, IBM DB2, Oracle, MySQL y Microsoft Access.\n", "\n", "Los datos en RDBMS se almacenan en objetos llamados tablas. Una tabla es una colección de entradas de datos relacionados y consta de columnas y filas. \n", "\n", "Cada tabla se divide en entidades más pequeñas llamadas campos. Los campos de la tabla Clientes constan de CustomerID, CustomerName, ContactName, Address, City, PostalCode y Country. Un campo es una columna de una tabla diseñada para mantener información específica sobre cada registro de la tabla.\n", "\n", "Un registro, también llamado fila, es cada entrada individual que existe en una tabla. Un registro es una entidad horizontal en una tabla.\n", "\n", "Una columna es una entidad vertical en una tabla que contiene toda la información asociada con un campo específico en una tabla. \n", "\n", "### Tablas\n", "\n", "Una base de datos suele contener una o más tablas. Cada tabla se identifica con un nombre (por ejemplo, \"Clientes\" u \"Pedidos\"). Las tablas contienen registros (filas) con datos.\n", "\n", "![](tablas.png)\n", "\n", "Tenemos 5 records y 7 campos.\n", "\n", "### SQL Statements\n", "\n", "Los statements son la sintaxis através de las cuales pedimos informaciones o modificaciones a la base de datos.\n", "\n", "** A diferencia que en Python los statements no son case sensitive **\n", "\n", " ```SELECT * FROM Customers; ```\n", " \n", "* ```SELECT```: extrae datos de una base de datos\n", "* ```UPDATE```: actualiza los datos en una base de datos\n", "* ```DELETE```: elimina datos de una base de datos\n", "* ```INSERT INTO```: inserta nuevos datos en una base de datos\n", "* ```CREATE DATABASE```: crea una nueva base de datos\n", "* ```ALTER DATABASE```: modifica una base de datos\n", "* ```CREATE TABLE```: crea una nueva tabla\n", "* ```ALTER TABLE```: modifica una tabla\n", "* ```DROP TABLE```:elimina una tabla\n", "* ```CREATE INDEX```: crea un índice (clave de búsqueda)\n", "* ```DROP INDEX```: elimina un índice \n", "\n", "La instrucción SELECT se utiliza para seleccionar datos de una base de datos.\n", "\n", "Los datos devueltos se almacenan en una tabla de resultados, denominada conjunto result set.\n", "\n", "```\n", "SELECT column1, column2, ...\n", "FROM table_name;\n", "\n", "SELECT * FROM table_name;\n", "```\n", "Si queremos seleccionar solo valores distintos utilizaremos el siguiente comando: \n", "\n", "```\n", "SELECT DISTINCT column1, column2, ...\n", "FROM table_name;\n", "```\n", "\n", "Si queremos saber cuantos valores distintos tenemos para cada campo usaremos:\n", "\n", "```\n", "SELECT COUNT(DISTINCT Country) FROM Customers;\n", "```\n", "\n", "Cuando queremos especificar alguna condición parrticular utilizaremos el *where*:\n", "\n", "```\n", "SELECT column1, column2, ...\n", "FROM table_name\n", "WHERE condition;\n", "\n", "SELECT * FROM Customers\n", "WHERE Country='Mexico';\n", "```\n", "Si queremos poner una condición numerica:\n", "\n", "```\n", "SELECT * FROM Customers\n", "WHERE CustomerID=1;\n", "```\n", "Las condiciones que podemos utilizar son ligeramente diferente con respecto a python:\n", "\n", "![](tabla2.png)\n", "\n", "La condición de *where* podemos combinarla con los operadores *AND,OR,NOT*\n", "\n", "\n", "```\n", "SELECT column1, column2, ...\n", "FROM table_name\n", "WHERE condition1 AND condition2 OR condition3 ...;\n", "```\n", "\n", "```\n", "SELECT column1, column2, ...\n", "FROM table_name\n", "WHERE NOT condition;\n", "```\n", "\n", "```\n", "SELECT * FROM Customers\n", "WHERE Country='Germany' AND (City='Berlin' OR City='München');\n", "```\n", "Para ordenar nuestra tabolas de resultados podemos utilizar el *ORDER BY*:\n", "\n", "```\n", "SELECT column1, column2, ...\n", "FROM table_name\n", "ORDER BY column1, column2, ... ASC|DESC;\n", "```\n", "\n", "Podemos utilizar más de un orden como vimos en Pandas:\n", "\n", "```\n", "SELECT * FROM Customers\n", "ORDER BY Country, CustomerName;\n", "```\n", "para manejar los *NULL*, que son los equivalente de los NA de pandas, podemos utilziar las operadores ```IS NULL``` y ```IS NOT NULL```\n", "\n", "```\n", "SELECT CustomerName, ContactName, Address\n", "FROM Customers\n", "WHERE Address IS NULL;\n", "\n", "```\n", "\n", "Con *UPDATE* podemos utiliactualziar los records:\n", "\n", "```\n", "UPDATE Customers\n", "SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'\n", "WHERE CustomerID = 1;\n", "```\n", "\n", "\n", "```\n", "SELECT COUNT(column_name)\n", "FROM table_name\n", "WHERE condition;\n", "```\n", "\n", "\n", "```\n", "SELECT SUM(column_name)\n", "FROM table_name\n", "WHERE condition;\n", "```\n", "\n", "\n", "```\n", "SELECT AVG(column_name)\n", "FROM table_name\n", "WHERE condition;\n", "```\n", "\n", "Otra función muy utili es el like:\n", "\n", "![](miao.png)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }