0% encontró este documento útil (0 votos)
8 vistas55 páginas

Python-06

Ewf

Cargado por

David
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
8 vistas55 páginas

Python-06

Ewf

Cargado por

David
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 55

Fastbook 06

Programación en Python
Pandas intermedio
Edix Educación

06. Pandas intermedio

En el fastbook anterior nos hemos introducido en la librería Pandas: hemos visto


cómo construir series y dataframes, y los métodos más básicos que se pueden
realizar con ellos. También hemos aprendido a cargar y exportar ficheros con esta
librería.

No obstante, nuestro camino en Pandas no ha hecho más que comenzar. En este


fastbook aprenderemos a operar con dataframes y realizar agrupaciones,
combinacion es de varias tablas y transformaciones de estructura.

Autor: Jesús Aguirre Pemán

Operaciones con estructuras de Pandas

Operaciones de grupos con dataframes

Transformaciones de estructura

Combinación de dataframes

Conclusiones
Lesson 1 of 5

Operaciones con estructuras de Pandas


Edix Educación

Ya que tanto series como dataframes están basados en arrays de Numpy (unidimensionales para
las series y bidimensionales para los dataframes), podemos realizar con ellos todas las
operaciones que veíamos en el fastbook de Numpy.

Operaciones con escalares

Al igual que en Numpy, las operaciones entre una serie y un escalar se harán elemento a
elemento.

Según el tipo de las series, podremos realizar unas operaciones u otras.


Para dataframes, el procedimiento es el mismo, pero deberemos tener cuidado cuando
tengamos datos de múltiples tipos.

Como veis, los números se han duplicado respecto al dataframe original, y el campo de texto tipo
se ha concatenado consigo mismo.

No obstante, si intentásemos hacer una división obtendríamos un error, ya que no es una


operación soportada por el tipo string.
Operaciones entre series y dataframes

Series

Las operaciones entre series también son similares a Numpy en cuanto a que se realizan
elemento a elemento, pero con una importante diferencia: en este caso utilizaremos el índice

para saber qué pares de elementos debemos combinar.

Al realizar operaciones entre dos series (como veremos posteriormente, ocurre los mismo con
dataframes), se realiza un proceso de alineación, en el que se obtiene:

Un índice combinado, formado por la unión de los índices de ambas series.

Los valores resultantes de aplicar la operación entre las dos series elemento a
elemento.

Veámoslo en un ejemplo.

Como veis, la serie resultante de la suma tiene como índice la unión de los dos índices como
si de sets se tratara: aparecen las etiquetas de la primera serie y, a continuación, todas las que
están en la segunda, pero no en la primera.
Por tanto, los valores que aparecen correctamente son los correspondientes a las etiquetas

comunes b y d. Para las demás, desconocemos su valor en una de las series, con lo que el
resultado es un valor NaN (not a number).

Profundizaremos más sobre estos valores perdidos en


fastbooks posteriores.

Dataframes

Al operar entre dataframes, se aplicará el mismo criterio sobre los índices, y también su análogo
para columnas. Es decir, las operaciones se harán entre elementos en el mismo índice y la
misma columna.

Por ejemplo, saquemos dos muestras del dataframe de productos.


Como veis, hay un producto en común (el 396) y una columna común (ventas_medias). Por
tanto, si sumamos ambos dataframes obtendremos solo un valor válido: las ventas medias
para ese producto.

Operaciones aritméticas

Afortunadamente, tenemos formas de hacer estas operaciones sin obtener esos valores NaN. En
primer lugar, podríamos utilizar el método reindex que introducíamos en el fastbook anterior, y

rellenar los valores nulos antes de realizar la operación.

No obstante, es preferible usar funciones que permitan introducir valores de relleno como
parámetros adicionales.
Operación Significado

add Suma dos dataframes

sub Resta dos dataframes

mul Multiplica dos dataframes

div Divide dos dataframes

floordiv Realiza la división entera entre dos dataframes

mod Calcula el módulo entre dos dataframes

pow Calcula la exponencial entre dos dataframes

En este ejemplo, hemos realizado la suma de los dos dataframes, rellenando los missing values
que aparezcan en el proceso de alineación (previo a la suma) con un 0. Aun así, en la columna
precio siguen apareciendo valores NaN, ya que no tenemos dato en ninguna de los dos tablas: en

el primer dataframe no tenemos esa columna, y en el segundo nos falta el dato de esos 3
productos.
Otras operaciones

Transposición

En el caso de un dataframe, al ser un array bidimensional de datos, podemos trasponerlo como si
se tratase de una matriz: las filas pasarán a ser columnas, y viceversa. Al igual que en Numpy,
podemos realizar esta operación con el atributo T.
Comparación

En ocasiones puede ser útil comprobar si dos series o dataframes contienen la misma
información. Para ello podemos utilizar el método equals en cualquiera de estas estructuras.

Operaciones de agregación

Al igual que en los arrays de Numpy, también podemos realizar operaciones de agregación sobre
series y dataframes de Pandas. Algunas de las más utilizadas podéis verlas en la siguiente tabla.

Operación Significado
count Número de valores no nulos
max Máximo de los valores
mean Media de los valores
median Mediana de los valores
min Mínimo de los valores
nunique Número de valores únicos
prod Producto de los valores
std Desviación típica de los valores
sum Suma de los valores
var Varianza de los valores

Todas las funciones anteriores producirán un único valor si se

realizan sobre una serie, y una serie con un valor para cada

columna si las realizamos sobre un dataframe.


Veamos un ejemplo para un dataframe.

También podemos aplicar estas operaciones de agregación sobre series.


Lesson 2 of 5

Operaciones de grupos con dataframes


Edix Educación

Agrupando dataframes

Ya hemos visto cómo calcular métricas agregadas como la media o la suma. Muchas veces es útil
hacerlo con base en ciertas categorías o grupos. Por ejemplo, en nuestro dataset de productos,
¿no sería interesante obtener las ventas medias según el tipo de producto?

A la hora de calcular estas métricas por grupos, se realiza un proceso en tres pasos:

1 Separar los datos en grupos. En nuestro ejemplo, separamos el dataframe de


productos en 5 grupos, los 5 valores de la variable tipo.

2 Aplicar una transformación a cada grupo. En nuestro ejemplo, la media de la


columna ventas_medias.

3 Combinar los resultados obtenidos. En nuestro caso, querríamos una serie o un


dataframe con una correspondencia entre tipos y sus medias.

Ahora que ya sabemos cómo es el proceso, veamos cómo implementarlo en Python. La función

que realiza la agrupación es groupby, y nos devolverá un DataFrameGroupBy.


En primer lugar, carguemos nuestro dataframe de productos.

Separar

Realicemos el groupby. De momento, el único parámetro que nos interesa es el primero: by, es

decir, por qué columna (o columnas) queremos agrupar.

Como veis, este objeto no tiene representación visual como sí ocurre con los dataframes. Para
obtener uno de los grupos que hemos creado, podemos utilizar el método get_group.
El resultado vuelve a ser un dataframe, que contiene en este caso todos los productos de tipo
Pasta.

Aplicar y combinar

Volvamos a nuestro dataframe agrupado. Según el proceso de tres pasos, ya hemos realizado

la fase de agrupación, y tras ello deberíamos aplicar la transformación a cada grupo.

En los DataFrameGroupBy tenemos disponibles todas las funciones de agregación que hemos
visto anteriormente, y algunas adicionales como las que podemos ver en la siguiente tabla.

Operación Significado

size Devuelve el tamaño del grupo

first Devuelve el primer elemento del grupo

last Devuelve el último elemento del grupo

nth Devuelve el elemento en la posición n del grupo

Calculemos el número de productos de cada tipo.


Podemos acceder a una columna concreta del DataFrameGroupBy y aplicar una función de
agregación.

Además, con el método agg (abreviatura de aggregation, agregación), podemos agregar


varias columnas utilizando una o más funciones.
Como hemos visto en los ejemplos anteriores, al indicar la transformación se realiza
automáticamente la fase de combinación, y obtenemos una serie o un dataframe (en función
del número de columnas que agreguemos).

En este último caso, la columna tipo, que ha sido por la que hemos agrupado, aparece como
índice del dataframe. Además, hemos agregado mediante las funciones mean y median de
Numpy, pero incluso podríamos utilizar funciones definidas por nosotros mismos.

En muchas ocasiones, preferiremos tener un índice numérico, y que todos nuestros datos estén
en las columnas del dataframe. Para devolver la variable tipo a una columna, recordad que
tenemos disponible la función reset_index.
Otra opción para evitar tener las columnas de agrupación como índice es usar el parámetro
as_index de la función groupby.

Por último, con el parámetro sort podemos desactivar el orden automático que se realiza entre
los grupos (si os fijáis en los ejemplos anteriores, los tipos aparecen ordenados
alfabéticamente).

Al desactivar este orden entre grupos, aparecerán en el mismo orden que en el dataframe
original.
Propiedades de un objeto DataFrameGroupBy

Los objetos DataFrameGroupBy no son exactamente dataframes, sino una colección de


dataframes separados por una o varias claves. Por tanto, podemos iterar sobre ellos, de forma
similar a como hacíamos con la función enumerate (recordad las funciones para recorrer
estructuras de datos que vimos anteriormente).

En nuestro ejemplo, tendríamos cinco dataframes, cada uno con un tipo de productos distinto.

Al ser una colección de dataframes, comparten con ellos muchos de sus métodos y propiedades.
Como hemos visto anteriormente, podemos hacer indexación para seleccionar la columna (o
columnas) que queramos antes de aplicar las funciones de transformación.

Y una vez que las hemos seleccionado, aplicamos la función median.

Métodos de un objeto DataFrameGroupBy

Además de las propiedades del apartado anterior, también contamos con una serie de métodos
útiles. No obstante, ya que el objeto DataFrameGroupBy no es un dataframe, sino una colección
de estos, no tendremos acceso a todos los métodos de los dataframes (por ejemplo, no podréis

realizar assign).

Los tres métodos que vamos a ver a continuación están también están disponibles para
dataframes normales, pero al usarlos sobre objetos DataFrameGroupBy conseguimos una mayor
flexibilidad en cuanto a las operaciones que podemos llegar a hacer.
1 Filter

Con el método filter podremos filtrar observaciones de un dataframe en función de los valores

de un grupo. Esta función combina especialmente bien con las expresiones lambda que veíamos
en fastbooks anteriores, ya que nos permite acceder a los grupos del DataFrameGroupBy y
calcular agregaciones de forma sencilla.

En el ejemplo, seleccionamos los productos cuyo tipo cumple que el promedio de la columna
ventas_medias es mayor que 1000: hortaliza, fruta y pan.

2 Transform

El método transform permite realizar operaciones sobre las filas del dataframe. El resultado de la
transformación tendrá la misma dimensión (número de filas y columnas) que el dataframe
original.

En el ejemplo, hemos calculado la desviación respecto a la media de cada elemento del

dataframe.
3 Apply

Pese a que el método transform es muy útil, lo más frecuente es que queramos añadir

información a las columnas ya existentes en el dataframe. Con la función apply podremos


aplicar funciones sobre grupos, añadiendo tantas columnas como queramos.

En el ejemplo, definimos una función que recibirá un dataframe, calculará el promedio de las
ventas medias, y lo añadirá como columna. Al aplicarla sobre el DataFrameGroupBy,

calcularemos este promedio para cada grupo.


También podemos combinar este método con una expresión lambda, como en este otro
ejemplo.

Particularidades de las agregaciones

Agrupando por más de una columna

Puede parecer que agrupar por varias columnas es igual de sencillo que hacerlo por una, y, a

efectos prácticos, tal vez lo sea. Veámoslo más claro con un ejemplo.

Hemos creado un dataframe con una columna adicional que indica si un tipo es perecedero.
Agrupemos por esta columna y tipo, y veamos qué ocurre.

El resultado es un dataframe, pero si os fijáis, hay dos columnas en el índice, y además

parecen tener cierta jerarquía, ya que los valores de perecedero solo aparecen una vez, en
lugar de repetirse en cada línea. Hasta ahora, los índices siempre eran una sola serie de datos,

ya fueran numéricos o etiquetas. A estos índices con más de una serie de datos se les
denomina MultiIndex.
¿Por qué decía que a efectos prácticos no hay diferencia? Siempre podemos ejecutar el
método reset_index, e integrar como columnas los elementos del MultiIndex, volviendo a un

índice RangeIndex.

Más adelante veremos qué ventajas nos proporcionan estos


MultiIndex, y por qué puede ser útil mantenerlos.

Agrupando por más de una columna


Aplicando más de una función

Al igual que hemos obtenido un MultiIndex al agrupar por más de una variable, si aplicamos

más de una función a alguna columna, obtendremos otro MultiIndex, en este caso en las
columnas.

En este caso la solución no es tan inmediata. Podemos cambiar los nombres de las columnas,
simplemente dando un nuevo valor al atributo columns del dataframe.
Multiíndices

En los ejemplos anteriores hemos visto que, al agrupar por varias variables, o con varias
funciones para una misma variable, obteníamos índices de tipo MultiIndex. Como hemos visto,

siempre podemos volver a un índice más sencillo, pero en este apartado aprenderemos a
trabajar con ellos.

Indexación jerárquica

A los multiíndices también se les denomina índices jerárquicos, y por tanto, a la indexación en
MultiIndex también se le llama indexación jerárquica (hierarchical indexing). Esta nos
proporcionará cierta simplicidad para operar con las series que forman el índice.

Recuperemos el ejemplo del apartado anterior.


En este caso, podemos seleccionar todos los productos no perecederos mediante loc, tal y
como haríamos con un índice simple.

Si queremos elegir una combinación de las dos series, podemos utilizar la notación de tupla

en el loc, de la siguiente manera.

Como veis, obtenemos una serie. Si queremos mantener la estructura de dataframe,

deberemos utilizar doble corchete en la sentencia loc.


Stack y unstack

La función unstack nos permite pivotar uno de los niveles de un dataframe con índice jerárquico.
Simplemente tendremos que indicar el nivel que queremos pivotar, y esa dimensión pasará de
ser un índice en filas a un índice de columnas.

Lo veremos más claro utilizando el dataframe del ejemplo anterior.

Al pasar el índice perecedero a las columnas, obtenemos dos columnas: las ventas medias
cuando perecedero es False, y cuando es True. En nuestro caso, perecedero solo puede tomar

un valor para cada tipo, por lo que obtenemos valores NaN. Si queremos dar un valor por
defecto a estos missing values podemos utilizar el parámetro fill_value de la función.
De forma similar, podemos usar la función stack para realizar la operación inversa, si bien es
menos común que unstack. Apliquémosla sobre el dataframe anterior.

Veréis que ahora perecedero es el segundo nivel, puesto que tipo ya se encontraba en el índice
y ha permanecido como primero. Ya hemos introducido operaciones que transforman la
estructura en este tipo particular de dataframes, y en este próximo capítulo vamos a
profundizar sobre ellas para dataframes con índices simples.
Lesson 3 of 5

Transformaciones de estructura
Edix Educación

Un dicho común en la analítica de datos es que el 80% del tiempo se destina a limpiar y preparar
los datos. En muchas ocasiones tendremos la información necesaria, pero no en el formato que
necesitemos.

En este apartado aprenderemos a transformar la estructura


de un dataframe: pasaremos de tablas con muchas columnas
y pocas filas a otras con muchas filas y pocas columnas, y
viceversa.

Dataframes wide y long

En data science se suelen utilizar los términos wide y long para describir dos formatos de

presentación de la información de un dataframe.

En el formato wide (o ancho), cada variable de los datos aparece en una columna
diferente.
En el formato long (o largo), toda la información aparece en una columna, teniendo
columnas adicionales que permiten identificar a qué variable y otras posibles claves
pertenece.

Para ver las diferencias, recuperemos nuestro dataset de productos, y construyamos una tabla
con los valores medios por tipo.

Esa tabla tiene un formato wide, ya que cada variable (precio, ventas y semanas) se corresponde
con una columna diferente.

Pasando de wide a long

La función melt nos permite pasar un dataframe wide (como el del ejemplo anterior) en su

equivalente long. Deberemos indicar qué columnas son identificadores (parámetro id_vars) y
cuáles son variables (value_vars).

Para construir las nuevas columnas del dataframe long, podremos especificar el nombre de la
nueva columna que identificará de qué variable se trata (por defecto, variable), y de la columna
que contendrá los valores (por defecto, value).
Pasando de long a wide

Si queremos pasar de una tabla long a una wide, utilizaremos la función pivot. En este caso,
tenemos 3 argumentos que deberemos rellenar:

index, con las columnas identificadoras. En nuestro ejemplo, la columna tipo.

columns, con la columna que se utilizará para crear las columnas del dataframe wide.
Obtendremos tantas columnas como valores únicos tengamos en esta columna del
dataframe long. En nuestro ejemplo es la columna variable.

values, con la columna de valores. En nuestro ejemplo, value.


Como veis, hemos recuperado nuestro dataframe original en formato wide (la única diferencia
es que las columnas están ordenadas alfabéticamente).

También podemos aplicar la función pivot sobre dos columnas de valores, con lo que

obtendríamos un MultiIndex en las columnas.

En este caso, el multiíndice en las columnas tendrá como primer elemento la variable de valor
(value y valor_doble) y, como segundo, la medida (precio, semanas_historico y ventas_medias).

Pivotando tablas

Una de las funcionalidades más usadas de Excel son las pivot tables, y Pandas no se iba a quedar
atrás. Con la función pivot_table vamos a aprender a realizar estas operaciones, que agrupan y
combinan valores de forma bidimensional.

De forma similar a pivot, tenemos los parámetros index, columns y values, además de aggfunc,
con la función (o funciones) que queremos utilizar para la agregación. No obstante, y como

veremos a continuación, esta sintaxis es mucho más sencilla y concisa que usar groupby y pivot.
Comencemos por lo más sencillo, agrupar por un índice. Por defecto, la operación de
agregación que realizará pivot_table es la media.

Si indicamos el parámetro columns, obtendríamos la tabla traspuesta de la anterior.


También podemos utilizar ambos parámetros simultáneamente, con lo que obtendremos un
dataframe con varios niveles en las columnas.

O de forma análoga, indicar ambas columnas como índice para obtener un dataframe con
MultiIndex en las filas.
Con el parámetro aggfunc podemos indicar qué función de agregación utilizar. Igual que con
groupby, para cada columna podemos utilizar una o más funciones, que pueden incluir

funciones definidas por nosotros mismos, o incluso funciones lambda.


Por último, con el parámetro margins podemos incluir los totales como última fila, e indicar
el nombre mediante margins_name.
Lesson 4 of 5

Combinación de dataframes
Edix Educación

Concatenación

Una vez hemos aprendido las operaciones básicas que se pueden hacer sobre un dataframe, es el
momento de empezar a combinarlos.

La función concat permite combinar varios dataframes (también está


disponible para series) a lo largo de un eje ( las o columnas).

Veamos un ejemplo sencillo.

En primer lugar, vamos a crear dos dataframes que contendrán productos de tipo fruta y
hortaliza.
Ahora vamos a usar la función concat para combinarlos, y extraeremos una muestra de esa
combinación para comprobar que tenemos productos de ambos tipos.

Como veis, la función concat recibe un primer parámetro (objs) con los dataframes (o series)

a concatenar. Nosotros hemos pasado una lista, pero vale cualquier secuencia o incluso un
diccionario, siempre y cuando sus valores sean dataframes o series.

Por defecto, se concatena en el eje 0 (filas). Si queremos concatenar a lo largo de las


columnas, asignaremos el valor 1 al parámetro axis.
Otra opción interesante es concatenar solo las columnas comunes (cuando concatenamos

filas), o los índices comunes (si concatenamos columnas). Esto lo haremos asignando el
valor inner al parámetro join. Por defecto, hemos visto que se concatenan todas las columnas
o índices (valor outer).

Ya vemos que, al concatenar varios dataframes, el índice que obtenemos no está ordenado, e
incluso puede tener duplicados. Si queremos volver a tener un RangeIndex, podemos llamar a
la función concat con ignore_index = True.
Si queremos usar un método del propio dataframe, tenemos disponible append. Al dataframe
sobre el que lo llamemos podremos añadirle otro (o una lista de dataframes). Al contrario que

concat, append solo permite combinar por filas.

Joins

Trabajando con tablas de datos, una operación básica es combinarlas en función de columnas
comunes, lo que en la mayoría de los lenguajes de programación se denomina join. En Pandas
disponemos de los métodos merge y join.

Aunque hablaremos de dataframes a lo largo de este apartado, merge también está disponible
para series.
Uso básico

Comencemos con merge. Tenemos cuatro parámetros clave en esta función:

left: el dataframe (o serie) izquierdo.

right: el dataframe (o serie) derecho.

on: en base a qué columnas se va a realizar la unión. Por defecto, las comunes a
ambos dataframes.

how: cómo se va a producir la unión. Por defecto, inner.

Para verlo en funcionamiento, cargaremos antes otro dataframe con el que cruzar el de
productos.
En esta tabla tenemos en cuántas tiendas y provincias se vende cada producto. Vemos que la

columna id_producto también aparecía en la tabla de productos, por lo que podríamos cruzar
ambas y obtener un único dataframe.

No hemos especificado clave, así que por defecto ha cogido la común: id_producto. Es siempre
recomendable indicarla, ya que lo contrario nos puede llevar a comportamientos no
deseados.

La unión que se ha realizado es un inner join (productos comunes a ambas tablas). Como en
la tabla de productos_tiendas tenemos menos productos, el número de filas de nuestro
dataset ha disminuido.
Si indicamos que el join sea left, mantendremos todas las filas del primer dataframe, y para
las que no tengan correspondencia con la segunda tabla, los valores de las nuevas columnas

aparecerán como NaN (Not A Number, veremos más sobre ellos en el próximo fastbook).

Y, efectivamente, no perdemos ningún registro del primer dataframe en el proceso.


Es importante recalcar que los campos por los que vayamos a cruzar las tablas deben ser del
mismo tipo en ambas tablas, ya que de lo contrario obtendremos un error.

Para evitarlo, simplemente haremos el cambio de tipos necesario antes de juntar las tablas,
ya sea modificando el dataframe, o directamente al hacer el merge.
Antes de pasar a profundizar sobre el resto de las opciones y parámetros de merge, veamos
como también podemos usarlos como método de un dataframe.

Sin embargo, si queremos combinar series con merge, solo podremos hacerlo con la función
del módulo Pandas (pd.merge), puesto que no hay método propio para series.

Más sobre merge

Ya hemos visto los fundamentos de la función merge, pero nos quedan una serie de casuísticas y
parámetros que nos ayudarán a dominar definitivamente los cruces de tablas.
1 Cruzar campos con distintos nombres

A menudo querremos cruzar dos tablas por un campo común, pero que tiene distinto nombre en

cada una de ellas. Podemos renombrar este identificador en una de las dos tablas, y cruzar
mediante el parámetro on como hasta ahora, o utilizar los parámetros left_on y right_on.

Vemos, además, cómo aparecen los dos campos id_producto y cod_prod por los que hemos
cruzado, y este último con valores NaN en los productos que no están presentes en la segunda
tabla.

2 Cruzar por el índice

Aunque menos frecuente que el caso anterior, también podemos cruzar dos tablas por su índice
en lugar de por una o más columnas. Para ello contamos con los parámetros booleanos
left_index y right_index. Si indicamos alguno de ellos como True, se utilizará el índice como la
clave en el dataframe izquierdo o derecho respectivamente.
En el ejemplo, hemos utilizado el índice como clave del segundo dataframe, y la columna
id_producto como clave del primero.

Pandas también nos ofrece la función join para este tipo de cruces por índice (en join
deberemos cruzar por el índice en ambas tablas). No obstante, tened cuidado, ya que el cruce
será left por defecto (en merge es inner).
La ventaja que ofrece join respecto a merge es que podemos cruzar varios dataframes a la vez,
como vemos en el siguiente ejemplo.

Como veis, hemos cruzado la tabla de productos con una lista formada por dos dataframes, el
de productos tiendas, y este mismo renombrando las variables con su primera letra.

3 Tratamiento de campos coincidentes

Puede ser que tengamos campos con nombres comunes en ambos dataframes, pero que no
formen parte de las claves por las que crucemos.

En el ejemplo, hemos añadido el campo tipo a la tabla de productos_tiendas, con lo que al cruzar
solo por id_producto nos aparecen dos campos tipo, con los sufijos ‘_x’ e ‘_y’ que indican si
pertenecen a la tabla izquierda (‘_x’) o derecha (‘_y’).
Además, podemos especificar estos sufijos mediante el campo su xes, que aceptará una tupla
con los dos sufijos, como vemos en este otro ejemplo.

4 Cardinalidad

La cardinalidad de un join entre dos tablas es la relación numérica entre


las las de una y otra tabla.
Esta cardinalidad puede ser uno a uno (1:1), uno a muchos (1:N), muchos a uno (N:1), o muchos
a muchos (N:N).

En nuestro ejemplo anterior cruzábamos dos tablas mediante la columna id_producto, que

aparecía una única vez en cada tabla. A este tipo de unión se le llama uno a uno, pero podemos
tener casos donde una clave aparezca más de una vez en alguna de las dos tablas.

En la práctica, el funcionamiento es el mismo, pero el tamaño de nuestras tablas se


incrementará al hacer estos cruces.

Veamos un ejemplo, para el que cargaremos un dataframe de ventas por producto y semana.

Como veis, a cada producto le corresponden varias semanas, por lo que si unimos la tabla de
productos con esta nueva, la cardinalidad será 1:N.
Podéis comprobarlo en el número de filas: la tabla productos tenía 100 filas; la de ventas,
2015; y su unión, también 2015.

Además, a partir de la versión 0.21.0 de Pandas, contamos con el parámetro validate para
comprobar la cardinalidad del cruce. Como el caso anterior es 1:N, podemos indicarlo
mediante los strings one_to_many o 1:m (podéis ver en la documentación el resto de valores
posibles, correspondientes con las distintas cardinalidades).

Si, por el contrario, introducimos otra cardinalidad en validate, obtendremos un error como
el del siguiente ejemplo.
5 Indicador de tabla

El parámetro booleano indicator nos añadirá un campo _merge que indicará si cada línea aparece
solo en el dataframe izquierdo (valor left_only), en ambos (both) o solo en el derecho

(right_only).

Esto puede ser muy útil si lo combinamos con un value_counts de ese campo, ya que nos
permitirá ver rápidamente cuántas filas han cruzado (en nuestro caso, un 20%).
Lesson 5 of 5

Conclusiones
Edix Educación

En este fastbook hemos continuado nuestro aprendizaje de la librería Pandas. Ya conocíamos los
dataframes y series del fastbook anterior, así como las acciones más elementales que se pueden
realizar sobre ellos. Hemos continuado viendo cómo se opera y se realizan agrupaciones con
estas estructuras, para posteriormente poder agregar los datos.

A continuación, hemos aprendido a transformar la estructura de los dataframes, convirtiendo

entre formatos long y wide. También hemos visto las pivot tables, una herramienta básica de
Excel que ya somos capaces de replicar con Pandas. Finalmente, hemos visto cómo combinar
varios dataframes, ya sea concatenando a lo largo de filas o columnas o realizando joins
mediante la función merge.

Todavía nos queda mucho que aprender en Pandas, y en el


siguiente fastbook nos centraremos en el tratamiento de
datos. Como siempre, os recomiendo repasar bien los nuevos
conocimientos de este fastbook antes de pasar al siguiente.

¡E n h o r a b u e n a ! Fa s t b o o k s u pe r a d o
Creamos Digital Workers

También podría gustarte