No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Merge y Concat

20/24
Recursos

Como podemos usar la l贸gica anteriormente vista en c贸digo, usando los par谩metros de Pandas

  • Importamos Pandas y Numpy
import pandas as pd
import numpy as np

Concat

  • En esta ocasi贸n vamos a crear un DataFrame nuevo
df1 = pd.DataFrame({'A':['A0', 'A1', 'A2','A3'],
        'B':['B0', 'B1', 'B2','B3'],
	'C':['C0', 'C1', 'C2','C3'],
	'D':['D0', 'D1', 'D2','D3']})


df2 = pd.DataFrame({'A':['A4', 'A5', 'A6','A7'],
	'B':['B4', 'B5', 'B6','B7'],
	'C':['C4', 'C5', 'C6','C7'],
	'D':['D4', 'D5', 'D6','D7']})
  • Concatenar los DataFrames
pd.concat([df1,df2])
---> A  B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
0   A4  B4  C4  D4
1   A5  B5  C5  D5
2   A6  B6  C6  D6
3   A7  B7  C7  D7
  • Corregir los 铆ndices
pd.concat([df1,df2], ignore_index= True)
---> A  B   C   D
0   A0  B0  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3
4   A4  B4  C4  D4
5   A5  B5  C5  D5
6   A6  B6  C6  D6
7   A7  B7  C7  D7
  • Por axis 1
pd.concat([df1,df2], axis = 1)
---> A  B   C   D   A.1 B.1 C.1 D.1
0   A0  B0  C0  D0  A4  B4  C4  D4
1   A1  B1  C1  D1  A5  B5  C5  D5
2   A2  B2  C2  D2  A6  B6  C6  D6
3   A3  B3  C3  D3  A7  B7  C7  D7

Merge

  • Creamos DataFrame
izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
  • Unir el DataFrame Der a Izq
izq.merge(der)
---> key A  B   C   D
0   k0  A0  B0  C0  D0
1   k1  A1  B1  C1  D1
2   k2  A2  B2  C2  D2
3   k3  A3  B3  C3  D3
MERGE 2
izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key_2' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
  • Hay diferencias entre algunas columnas, por esa raz贸n hay que separarlos de esta manera:
izq.merge(der, left_on = 'key', right_on='key_2')
---> key A  B   key_2   C   D
0   k0  A0  B0  k0    C0  D0
1   k1  A1  B1  k1    C1  D1
2   k2  A2  B2  k2    C2  D2
3   k3  A3  B3  k3    C3  D3
MERGE 3

izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key_2' : ['k0', 'k1', 'k2',np.nan],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
  • Si tenemos un NaNen nuestro DataFrame, pandas no lo detectar谩 como un mach. Se soluciona con How, dando as铆, una preferencia.
izq.merge(der, left_on = 'key', right_on='key_2', how='left')
---> key A  B   key_2   C   D
0   k0  A0  B0  k0    C0  D0
1   k1  A1  B1  k1    C1  D1
2   k2  A2  B2  k2    C2  D2
3   k3  A3  B3  NaN  NaN  NaN

Contribuci贸n creada por: Edward Giraldo.

Aportes 29

Preguntas 6

Ordenar por:

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

o inicia sesi贸n.

Aqu铆 los diccionarios:

CONCAT

	df1 = pd.DataFrame({'A':['A0', 'A1', 'A2','A3'],
	'B':['B0', 'B1', 'B2','B3'],
	'C':['C0', 'C1', 'C2','C3'],
	'D':['D0', 'D1', 'D2','D3']})


	df2 = pd.DataFrame({'A':['A4', 'A5', 'A6','A7'],
	'B':['B4', 'B5', 'B6','B7'],
	'C':['C4', 'C5', 'C6','C7'],
	'D':['D4', 'D5', 'D6','D7']})

MERGE 1

izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})

MERGE 2

izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key_2' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})

MERGE 3

izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key_2' : ['k0', 'k1', 'k2',np.nan],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})

A est谩s alturas del curso puedo decir que est谩 mil veces mejor que el anterior curso sobre pandas, demasiado bueno el profesor.

Hola, un ejercicio que hice y pueden hacer para practicar estos conceptos es pedirle datos de ejemplo de la vida real al chatgpt.
Le pedi ejemplos de datos de pacientes. y me salieron varios dataframes que pude usar para hacer merge, join y concatenate.

Si usas el comando outer te va votar 4 registros,ya que, estar谩n contenidos los registros del left ,del right y del inner.

El CONCATENATE se puede usar con dataframe que pueden tener diferencias en alguna columna.
Del dataframe de los libros hacemos 2 dataframe con columnas distintas y los concatenamos

df_books = pd.read_csv('/content/VIDEO 12 bestsellers-with-categories.csv',sep=',',header=0)
df_books.head(2)


Con las primeros registros

df_books_1=df_books[['Name','Author','Price','Year']].head(5)
df_books_1

Con los 煤ltimos registros y adem谩s tiene la columna GENRE

df_books_2=df_books[['Name','Author','Price','Year','Genre']].tail(5)
df_books_2


Concatenamos en sentido axis = 0. Los valores faltantes son NULL

df_books_concat = pd.concat([df_books_1,df_books_2],ignore_index=True)
df_books_concat


A los valores nulos le asignamos Unrated (sin clasificaci贸n) que es m谩s descriptivo.
Para eso usamos where y la concatenaci贸n en sentido de las columnas (axis=1).

df_genre = df_books_concat.Genre.where(df_books_concat.Genre.notnull() ,'Unrated')
df_books_concat2 = pd.concat([df_books_concat[['Name','Author','Price','Year']],df_genre],axis=1)

Aporte para crear los diccionarios usados en la clase. Es un m茅todo mucho m谩s complejo que simplemente copiar, pegar y modificar.

Sin embargo, lo aporto como ejemplo del uso de list y dictionary comprehensions en python nivel intermedio.

# genera lista con keys: 'A', 'B', 'C', 'D'
keys = list('ABCD')  

# values ser谩 un list comprehension que contendr谩 una lista de listas:
# ['A0', 'A1', ..., 'A3'], ['B0', 'B1', ..., 'B3'], ...
# es un list comprehension anidado
values = [ 
            # list comprehension anidado
            # crea una lista del tipo: ['A0', 'A1', ..., 'A3']
            [f'{letter}{number}' for number in range(4)]    
         # para las letras A, B, C, D, E, F
         for letter in list('ABCDEF')
         ]

df3 = pd.DataFrame(
    # dictionary comprehension:
    # uso zip para crear tuplas de dos elementos que suministren
    # pares de valores k:v al diccionario
    {k:v for k,v  in zip(keys, values)}
)

Informaci贸n resumida de esta clase
#EstudiantesDePlatzi

  • Utilizando la funci贸n concat puedo unir diferentes DataFrame y estos deben ir dentro de [ ]

  • Por defecto la fusi贸n se hace por el Axis = 0, es decir por las filas, si utilizamos el Axis = 1, la fusi贸n se realizar谩 por las columnas

  • Tambi茅n podemos utilizar la funci贸n merge para fusionar 2 DataFrame, lo ideal seria que nuestros DataFrame tengan una llave en com煤n para realizar un correcto merge

  • Cuando los conjuntos de datos no poseen una llave en com煤n, debemos especificar que llave se usara en right y que llave en left

  • Utilizando el par谩metro how, puedo definir qu茅 tipo de uni贸n voy a realizar. Muy parecido a las consultas que se hacen en SQL

Para no confundierse con el axis entre el 0 y el 1 pueden usar la palabra 鈥渃olumns鈥 o 鈥渞ows鈥.

pd.concat([df1,df2],axis="columns")

Hola! Un peque帽o grafico colorido de merge por izquierda para nosotros los dummies

Muy buena la clase. Mejor explicado que en la Universidad.

Alta remera profe!
(remera = camiseta)

Informaci贸n para entender la clase

Creo que el concat es el UNION de sql en pandas, si ya se que los pythoneros me vana decir que el concat es mas poderoso!!

Otra gran herramienta para salir adelante en las pruebas t茅cnicas.

Es bueno que a esta clase le a帽adas el concepto de clave primaria, para que la gente no se confunda con el uso compartido de Key.

Probemos lo que hace este comando:

izq.merge(der, left_on='key', right_on='key_2', how='outer')

NOTA QUE TE AHORRAR脕 TIEMPO:
Google Colab tiene atajos de teclado similares a VS code. Puedes cambiar de golpe varias l铆neas de c贸digo.
En vez de cambiar cada letra una por una, usa Ctrl + D para seleccionar las ocurrencias.

Le ped铆 unos ejemplos en OpenAi Gpt3 y puso ese mismo ejemplo el de Merge jejeje

Combinar DataFrames
Para combinar dataframes tenemos los m茅todos concat, merge y join

  • pd.concat(df_1,df_2) 鈫 concatena, a帽ade un dataframe luego de otro, permite los par谩metros de axis (por defecto 0) e ignore_index (True para resetear los 铆ndices ignorando los 铆ndices originales)

  • pd.merge(df_left, df_right) o df_left.merge(df_right), realiza una uni贸n de dataframes de manera similar a los conjuntos, admite el par谩metro on, que indica el nombre de la columna llave (la columna en com煤n), en caso no tengan el mismo nombre usamos los par谩metros left_on y right_on, otro par谩metro que admite es how que puede ser 鈥榣eft鈥, 鈥榬ight鈥, 鈥榠nner鈥 o 鈥榦uter鈥

    • left 鈫 trae todos los valores del df izquierdo, a帽ade valores nulos en las filas en las que no hay intersecci贸n con el df right
    • right 鈫 similar a left pero con el df derecho
    • outer 鈫 trae todos los datos, rellenandolos los valores que no tienen en com煤n cin valores nulos
    • inner 鈫 trae solo los valores de la intersecci贸n, es el valor por defecto
  • pd.join(), similar a merge pero la llave ser谩 el indice (por tanto no es necesario el par谩metro on no es necesario

izq.merge(der, left_on = 'Key', right_on = 'Key_2', how = 'right')

Mis apuntes #21 (Notion)


dic={"A":[f"A{i}" for i in np.arange(0,4) if i==i],
     "B":[f"B{i}" for i in np.arange(0,4) if i==i],
     "C":[f"C{i}" for i in np.arange(0,4) if i==i],
     "D":[f"D{i}" for i in np.arange(0,4) if i==i]
     }

Dejo mis apuntes de clase aqui

****NOTAS CLASE ****

Merge y Concat
Como podemos usar la l贸gica anteriormente vista en c贸digo, usando los par谩metros de Pandas
________________________________________
[1]
0 s
import pandas as pd
import numpy as np
________________________________________
[2]
0 s
df1 = pd.DataFrame({'A':['A0', 'A1', 'A2','A3'],
        'B':['B0', 'B1', 'B2','B3'],
    'C':['C0', 'C1', 'C2','C3'],
    'D':['D0', 'D1', 'D2','D3']})
________________________________________
[3]
0 s
df1
________________________________________
[4]
df2 = pd.DataFrame({'A':['A4', 'A5', 'A6','A7'],
    'B':['B4', 'B5', 'B6','B7'],
    'C':['C4', 'C5', 'C6','C7'],
    'D':['D4', 'D5', 'D6','D7']})

#aca estamos declarando nuestros dos data frame 
#el siguiente paso es concatenar ambos data frame con las funciones que vimos anteriormente 
________________________________________
[5]
0 s
df2
________________________________________
[6]
pd.concat([df1,df2])
#aca ya estan nuestros dos dataframe concatenados con todos los valores, como se puede ver los indices
#heredan el indice dela alterios esto no quiere desir que se repiten 
________________________________________
[7]
pd.concat([df1,df2],ignore_index=True)
#aca estamos corigiendo lo de los indices repetidos, tomando los valores y reorganizandoloes 
________________________________________
[9]
0 s
pd.concat([df1,df2],axis=1)

#en esta funciom organizamos con axis 1, a nivel de columnas el ampliara de manera columnar nuetra 
#concatenacion respetando la forma del dataframe lo cual ya no crecemos de forma vertical sino de formar 
#orizontal pero es muy raro hacerlo de esta forma 
________________________________________
funcion Merge
________________________________________
[13]
0 s
izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})
________________________________________
[14]
0 s
izq
________________________________________
[15]
0 s
der = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
________________________________________
[16]
0 s
der
________________________________________
[18]
izq.merge(der, on="key")
#aca se esta haciendo un merge por las columnas que tienen en comun tanto de izquierda como de derecha haciendo 
#de uan forma muy ordenada con la lleve (key) y asi  podemos hacer join 
________________________________________
[19]
0 s
izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key2' : ['k0', 'k1', 'k2','k3'],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
________________________________________
[21]
izq.merge(der, left_on="key", right_on="key2")
#estamos combinando ambos con la modificacion que se le hiso al segundo dataframe que se cambio key por key2
#est谩 haciendo la relaci贸n en el cambio de la derecha 
#esto lo hacemos cuando los dataframe no tienen el mismo nombre an la columna 
________________________________________
[23]
0 s
izq = pd.DataFrame({'key' : ['k0', 'k1', 'k2','k3'],
 'A' : ['A0', 'A1', 'A2','A3'],
'B': ['B0', 'B1', 'B2','B3']})

der = pd.DataFrame({'key2' : ['k0', 'k1', 'k2',np.nan],
 'C' : ['C0', 'C1', 'C2','C3'],
'D': ['D0', 'D1', 'D2','D3']})
________________________________________
[24]
0 s
der
________________________________________
[25]
izq.merge(der, left_on="key", right_on="key2")
#aca no me trae la tercera fila porque no me esta haciendo merge, solo esta trallendo la intercesion 
# entre ambos 
________________________________________
[26]
izq.merge(der, left_on="key", right_on="key2", how="left")
#con how me trae el valor de la izquierda respetando los valores asi no esten  
________________________________________
[27]
izq.merge(der, left_on="key", right_on="key2", how="inner")
#con inner traemos el valor por defaul que teniamos anteriormente 
________________________________________
[28]
izq.merge(der, left_on="key", right_on="key2", how="right")
#aca me trae todo lo de la dereche asi no este y lo digeranciara con valores nulos, de esta manera 
#puedo jugar con la combinaci贸n de mis datafrem 
________________________________________
y as铆 podemos utilizar el cooncat y merge para hacer la combinaci贸n y fusi贸n de distintos datafrem, esto es muy parecido a SQL

Seria bueno que se hiciera ese ejercicio con el DataFrame del csv

Muy buena clase, ten铆a dudas sobre .merge() y con esta clase se aclararon.