Pivot y Melt

22/24

Lectura

Hola, te doy la bienvenida a la clase de pivot_table y melt, dos funciones que sirven para cambiar la estructura de nuestro DataFrame de acuerdo a nuestras necesidades.

...

Reg铆strate o inicia sesi贸n para leer el resto del contenido.

Aportes 28

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

algo muy similar a la pivot_table son las tablas din谩micas utilizadas en las hojas de calculo.

Pivot

Un par谩metro intenresante de esta funci贸n es el fill_value: el cual nos permitir谩 determinar con que contenido queremos visualizar los valores NaN, para este ejemplo uso el caracter " - " :

Melt

En melt podemos adicionalmente con par谩metros determinar el nombre de nuestras columnas usando:

  • var_name='nombre_columna_variables
  • value_name='nombre_columna_valores'

Debo decir que no qued茅 para nada contento con esta 鈥渃lase鈥 si es q se le puede llamar as铆. Se entiende 10mil veces mas cuando hace la clase a trav茅s de los videos, como ya lo ven铆a haciendo, por qu茅 cambiar a este formato ?

A mi parecer, no es acertado que se incluyan s贸lo textos como 1 clase cualquiera.

Wow!! ya con esto se empieza a ver m谩s del potencial de estas herramientas

a aggfunc tambi茅n le podemos pasar una lista de funciones.

table = df.pivot_table(index='Genre', columns='Year', values='User Rating',aggfunc= [min, max, np.mean])
table

Este es un ejemplo de c贸mo suelo usar melt. Digamos que tengo una tabla con los locales (filas) y las ventas anuales (cols). Y quiero como resultado - tener 3 cols con Local, A帽o y Ventas.

import pandas as pd
data = {
    'Local': ['Local A', 'Local B', 'Local C'],
    #Ventas por ao
    '2021': [100, 200, 300],
    '2022': [150, 250, 350],
    '2023': [200, 300, 400]
}
df = pd.DataFrame(data)

Luego convertimos a las 3 cols:

df.melt(id_vars=['Local'],
        var_name='A帽o',
        value_vars=['2021','2022','2023'],
        value_name='Ventas')

La verdad es que estas herramientas son de gran ayuda en el an谩lisis de datos y sobre todo con grande vol煤menes de datos, que es en donde Excel hace 鈥渁guas鈥.

Hay 2 formas de generar el inverso de MELT. Una es usando PIVOT y otra PIVOT_TABLE.
https://stackoverflow.com/questions/22127569/opposite-of-melt-in-python-pandas

Para agregar una lambda function ser铆a de la siguiente manera.

df_books.pivot_table(index='Author',columns='Genre',values='Price',aggfunc=lambda x : sum(i * 1000 for i in x))

cuando usamos 鈥減ivot鈥 para crear una tabla de las calificaciones de los g茅neros a trav茅s de los a帽os:

df_books.pivot_table(index='Genre',columns='Year', values='User Rating',aggfunc='mean')

creo que es mas pertinente usar 鈥渕ean鈥 como funci贸n de entrada en vez de sum, as铆 vemos el promedio de calificaciones del genero y no solo una sumatoria que poca relevancia puede llegar a tener.

La funcion melt es un poco parecida ha aplicar unstack() pueden revisarla aqui:
https://www.w3resource.com/pandas/dataframe/dataframe-unstack.php

Sum is not an interesting attribute in comparison among 鈥楪enre鈥 and 鈥榊ear鈥 because sum of rating just not shows up how successful was Fiction or Non Fiction in each year. A more ccurate metric could be .mean()

df_books.pivot_table(index='Genre', columns='Year', values='User Rating', aggfunc='mean').round(2)

Personalmente no me gusta que la clase sea escrita , me gusta que sea en video como las anteriores que son exageradmente buenas , muy pero muy buenas

This function is useful to massage a DataFrame into a format where one or more columns are identifier variables (id_vars), while all other columns, considered measured variables (value_vars), are 鈥渦npivoted鈥 to the row axis, leaving just two non-identifier columns, 鈥榲ariable鈥 and 鈥榲alue鈥.

Cordial Saludo,

lo hice con una base propia

REMISION variable value
0 '208010808396 CLIENTE 'RYMCO MEDICAL S.A.S
1 '276020041637 CLIENTE 'CARVAJAL EDUCACION S.A.S.
2 '276020041638 CLIENTE 'CARVAJAL EDUCACION S.A.S.
3 '276020041639 CLIENTE 'CARVAJAL EDUCACION S.A.S.
4 '276020041640 CLIENTE 'CARVAJAL EDUCACION S.A.S.

Excelente varias herramientas m谩s para darle un formato diferente a tu dataframe seg煤n tus necesidads. **pivot\_table**: para cambiar los valores de tus columnas y usarlas como indexes, columnas de los valores de n columnas para tu nuevo dataframe. El hecho de poder usar funciones de agrupamiento hace muy 煤til a esta funci贸n. **Melt:** basicamente es una transformaci贸n vertical. Tus columnas n pasan a ser filas de tus valores n.

Power Pivot es muy usado en Power BI. Te sirve para identificar la relacion entre tablas.

El metodo melt, tiene algo de similar a una matriz transpuesta pues hace el cambio de columnas por filas.
Mientras que pivot_table se parece mucho a como se grafican los valores a mano de una funci贸n de dos variables independientes f(x,y)

Pivot/Melt

  • pivot: es un m茅todo que transforma los valores de determinados columnas o filas en un nuevo dataframe y la intersecci贸n de estos dan el valor resultante:
df.pivot_table(index = 'col1', columns = 'col2', values = 'col3', aggfuntion = 'func')
  • met: Toma las columnas del DataFrame y las pasa a filas con dos columnas que especifican ;a antigua fila y el calor que tenia:
df.melt(id_vars = 'col1',values_vars = 'col2')

Creo que pivot_table es muy 煤til, deja manipular y transformar los DataFrames de manera muy vers谩til.

Mi problema con las clases, pero particularmente con esta, es que si aprendo algo fuera de contexto es como si no aprendiera nada, me pasa con melt, 驴Cu谩les podr铆an ser sus casos de uso?, el texto no lo dice y no puedo pensar en algo con la poca experiencia que tengo

df_books.melt(id_vars='Year',value_vars='Genre')

Year variable value
0 2016 Genre Non Fiction
1 2011 Genre Fiction
2 2018 Genre Non Fiction
3 2017 Genre Fiction
4 2019 Genre Non Fiction
鈥 鈥 鈥 鈥
545 2019 Genre Fiction
546 2016 Genre Non Fiction
547 2017 Genre Non Fiction
548 2018 Genre Non Fiction
549 2019 Genre Non Fiction
550 rows 脳 3 columns

Ya que en esta secci贸n no hay video, aqu铆 hay un ejemplo de implementaci贸n de Melt que puede decirse que es como 鈥渄espivotar鈥 una tabla din谩mica. https://www.youtube.com/watch?v=-7QDKz6hWmc

Informaci贸n resumida de esta clase
#EstudiantesDePlatzi

  • Las funciones que nos ayudan para cambiar la estructura de nuestros DataFrames son melt y pivot_table

  • Con pivot_table puedo transformar los valores de columnas o filas en los 铆ndices de un nuevo DataFrame

  • Si utilizamos melt pasaremos los datos de una columna a ser filas y se crear谩n dos nuevas columnas para especificar la antigua columna y el valor que tra铆a

si no te suma es porque:

df_books = df_books.astype({'Name: 鈥榮tring鈥, 
														鈥Author鈥: 鈥榝loat64鈥,
														'User Rating: 鈥榝loat32鈥,
														鈥Reviews鈥: 鈥榠nt32鈥,
														鈥Price鈥: 鈥榝loat32鈥,
														鈥Year鈥: 鈥榠nt32鈥,
														鈥Genre鈥: 鈥榮tring鈥檥)

ese c贸digo funciona si al sumar en lugar de suma te repite el texto esto porque el csv no carga los valores correctos lo hemos ajustado usando astype :
nombre_de_tu_data_frame = nombre_de_tu_data_frame.astype({'Primera Columna: 鈥榯ipo_de_dato_de_tu_primera_columna鈥,
鈥2da columna鈥: 鈥榯ipodato鈥檥)

los tipos de datos soportados son los float (un numero con decimales), int (el entero sea 32 o 64)y string (cadenas de texto), entre otros鈥 creo que booleano es bool, aqu铆ite dejo el ejemplo para este c贸digo

si tienes columnas basura tambi茅n las puedes borrar como dice la clase anterior sobre borrar:

#por ejemplo tenemos el tipo de dato enla columna1 y los queremos eliminar para queno nos da帽e el formato  

nombre_de_tu_dframe = nombre_de_tu_dframe.drop(0, axis=0)

en este ejemplo eliminamos la primera columna que conten铆a los tipos de dato en una string


pivot_table
Esta funci贸n puede traer recuerdos a las personas interesadas en el mundo del SQL, ya que Oracle, PostgreSQL y otros motores de bases de datos la tienen implementada desde hace muchos a帽os. Pivot, b谩sicamente, transforma los valores de determinadas columnas o filas en los 铆ndices de un nuevo DataFrame, y la intersecci贸n de estos es el valor resultante.

Entiendo que esto puede sonar algo confuso, pero no te preocupes, todo queda mucho m谩s claro con un ejemplo.

Para comenzar, crea un nuevo Jupyter Notebooks, puedes usar Google Colab o la notebook de tu preferencia que est茅s utilizando para este curso.

Carga el DataFrame que hemos usado en el curso:

[1]
0 s
import pandas as pd
import numpy as np

[4]
0 s
df_books = pd.read_csv("/content/bestsellers-with-categories_.csv",sep=',',header=0)
df_books.head(10)

[6]
df_books.pivot_table(index='Author',columns='Genre',values='User Rating')
# aplicando pivot table
#Como resultado, los valores de Author pasan a formar el 铆ndice por fila y los valores 
#de Genre pasan a formar parte de los 铆ndices por columna, y el User Rating se mantiene como valor.



Por supuesto, para este caso, un Author suele tener un solo g茅nero literario, as铆 que no es una transformaci贸n muy 煤til, pero veamos si podemos lograr algo mejor.

[7]
df_books.pivot_table(index='Genre',columns='Year', values='User Rating',aggfunc='sum')
#Ejecuta la siguiente variaci贸n:
#En este caso tenemos por cada g茅nero, la suma a lo largo de los a帽os. Esto es mucho m谩s interesante, 驴verdad? 
#La mejor noticia es que no solo podemos obtener la suma, tambi茅n podemos obtener la media, la desviaci贸n est谩ndar, 
#el conteo, la varianza, etc. 脷nicamente con cambiar el par谩metro aggfunc que traduce funci贸n de agrupamiento.

melt
El m茅todo melt toma las columnas del DataFrame y las pasa a filas, con dos nuevas columnas para especificar la antigua columna y el valor que tra铆a.

Por ejemplo, simplemente al imprimir las cinco primeras filas del DataFrame con las columnas de Name y Genre se tiene este resultado.

[9]
0 s
df_books[['Name','Genre']].head(5)
#Para ello ejecuta la siguiente l铆nea en tu Jupyter Notebook:


[10]
df_books[['Name','Genre']].head(5).melt()
#Aplica melt de la siguiente manera:
#Ahora cada resultado de las dos columnas pasa a una fila de este modo a tipo 
#llave:valor.

[11]
0 s
df_books.melt(id_vars='Year',value_vars='Genre')
#En el siguiente ejemplo ejecutemos melt de esta manera:

Simplemente, podemos seleccionar las columnas que no quiero hacer melt usando el par谩metro id_vars. Para este caso Year y tambi茅n la 煤nica columna que quiero aplicar el melt, para este caso Genre con la propiedad value_vars.

Hemos conocido pivot y melt, dos herramientas muy 煤tiles para manipular nuestros DataFrames.

Te espero en la siguiente clase donde conoceremos c贸mo utilizar Apply.