Merge & Concat¶
En muchas ocasiones nos podemos encontrar con que los conjuntos de datos no se encuentran agregados en una única tabla. Cuando esto sucede, existen dos formas para unir la información de distintas tablas: merge y concat.
Concat¶
La función concat()
realiza todo el trabajo pesado de realizar operaciones de concatenación a lo largo de un eje mientras realiza la lógica de conjunto opcional (unión o intersección) de los índices (si los hay) en los otros ejes. Tenga en cuenta que digo "si hay alguno" porque solo hay un único eje posible de concatenación para Series.
Concatenar varias tablas con las mismas columnas¶
import os
import numpy as pd
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
frames = [df1, df2, df3]
result = pd.concat(frames)
Concatenar varias tablas con distintas columnas (por filas)¶
df4 = pd.DataFrame({'B1': ['hola', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
result = pd.concat([df1, df4], axis=0, sort=False)
Concatenar varias tablas con distintas columnas (por columnas)¶
result = pd.concat([df1, df4], axis=1, sort=False)
Merge¶
La función merge()
se usa para combinar dos (o más) tablas sobre valores de columnas comunes (keys).
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on='key')
En este ejemplo, se especifica en la opción on
las columnas (keys) donde se realizará el cruce de información de ambas tablas.
Tipos de merge¶
La opción how especificica el tipo de cruce que se realizará.
- left: usa las llaves solo de la tabla izquierda
- right: usa las llaves solo de la tabla derecha
- outer: usa las llaves de la unión de ambas tablas.
- inner: usa las llaves de la intersección de ambas tablas.
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
Merge left¶
merge_left = pd.merge(left, right,how= 'left', on=['key1', 'key2'])
Merge right¶
merge_rigth = pd.merge(left, right, how='right', on=['key1', 'key2'])
Merge outer¶
merge_outer = pd.merge(left, right, how='outer', on=['key1', 'key2'])
Merge inner¶
merge_inner = pd.merge(left, right, how='inner', on=['key1', 'key2'])
Problemas de llaves duplicadas¶
Cuando se quiere realizar el cruce de dos tablas, pero an ambas tablas existe una columna (key) con el mismo nombre, para diferenciar la información entre la columna de una tabla y otra, pandas devulve el nombre de la columna con un guión bajo x (key_x) y otra con un guión bajo y (key_y)
left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})
result = pd.merge(left, right, on='B', how='outer')