Fusionar Pandas Dataframe en el índice

  1. Usa merge() para combinar dos Pandas DataFrames en el índice
  2. Usa join() para combinar dos Pandas DataFrame en el índice

En el mundo de la ciencia de los Datos y el aprendizaje automático, es esencial ser fluido en las operaciones para organizar, mantener y limpiar los datos para su posterior análisis. La fusión de dos DataFrames es un ejemplo de una de esas operaciones. Resulta que es fácil combinar dos DataFrames utilizando la biblioteca de Pandas en Python.

Pandas nos proporciona dos funciones útiles, merge() y join() para combinar dos DataFrames. Ambos métodos son muy similares, pero merge() se considera más versátil y flexible. También proporciona muchos parámetros para alterar el comportamiento del DataFrame final. join() combina los dos DataFrames en sus índices, mientras que merge() nos permite especificar las columnas que pueden actuar como clave para fusionar dos DataFrames.

Un parámetro común de ambas funciones con el que uno debería estar familiarizado es how, que define el tipo de unión. Por defecto, el parámetro how es inner para merge() y left para join(), pero para ambos puede cambiarse a left, right, inner, y outter. Es esencial saber la diferencia entre todos ellos.

Al combinar dos Pandas DataFrame, asumimos que uno es el DataFrame izquierdo y el otro es el DataFrame derecho. Tanto mergge() como join() coinciden con los registros de las columnas clave. La unión inner devuelve un DataFrame de registros que coinciden en ambos DataFrames. La unión outer produce un DataFrame fusionado con todos los elementos de ambos DataFrames, rellenando NaN para los valores que faltan en ambos lados. El empalme left contiene todos los elementos del DataFrame izquierdo pero sólo los registros coincidentes del DataFrame derecho. Lo opuesto a left es right, que tiene todos los elementos del DataFrame derecho y sólo los registros coincidentes del DataFrame izquierdo. Todo esto será más claro en el código de ejemplo en las próximas secciones donde combinaremos los DataFrames en el código de abajo:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

print(df1)
print(df2)

Resultado:

  C1
1  a
2  b
4  d
5  e
7  h
   C2
1  AA
2  BB
3  CC
5  EE
6  FF

Usa merge() para combinar dos Pandas DataFrames en el índice

Cuando se fusionan dos DataFrames en el índice, el valor de los parámetros left_index y right_index de la función merge() debe ser True. El siguiente ejemplo de código combinará dos DataFrames con inner como tipo de combinación:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_inner = df1.merge(df2, how='inner', left_index=True, right_index=True)

print(df_inner)

Resultado:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

El siguiente código combinará los DataFrames con el tipo de unión como outer:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_outer = df1.merge(df2, how='outer', left_index=True, right_index=True)

print(df_outer)

Resultado:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

Como puedes ver, el DataFrame fusionado con el tipo join como inner sólo tiene registros coincidentes de ambos DataFrames, mientras que el que tiene el tipo join outer tiene todos los elementos presentes en ellos, llenando los registros que faltan con NaN. Ahora usando left join:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_left = df1.merge(df2, how='left', left_index=True, right_index=True)

print(df_left)

Resultado:

  C1   C2
1  a   AA
2  b   BB
4  d  NaN
5  e   EE
7  h  NaN

El DataFrame fusionado anterior tiene todos los elementos del DataFrame izquierdo, y sólo los registros coincidentes del DataFrame derecho. Su opuesto exacto es la unión right, como se muestra abajo:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])

df_right = df1.merge(df2, how='right', left_index=True, right_index=True)

print(df_right)

Resultado:

    C1  C2
1    a  AA
2    b  BB
3  NaN  CC
5    e  EE
6  NaN  FF

Usa join() para combinar dos Pandas DataFrame en el índice

El método join() combina los dos DataFrames en base a sus índices, y por defecto, el tipo join es left. Siempre utiliza el índice del DataFrame derecho, pero podemos mencionar la clave del DataFrame izquierdo. Podemos especificar los tipos de join para la función join() igual que mencionamos para la función merge().

El siguiente ejemplo muestra el DataFrame fusionado con el tipo de unión outer:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])
df_outer = df1.join(df2, how='outer')
print(df_outer)

Resultado:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

Artículo relacionado - Pandas DataFrame

  • Cómo obtener el agregado de Pandas grupo por y suma
  • Seleccionar múltiples columnas en Pandas Dataframe