Qué pasa si quiero unir por filas dos DataFrames que no tienen las mismas columnas¶

Hemos visto que concat alinea las columnas usando sus etiquetas, pero en algunas ocasiones, los dos DataFrames tienen algunas columnas diferentes

In [1]:
# Preliminares
import pandas as pd
import numpy as np

Consideramos los dos DataFrames:

In [2]:
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index=list('ijk'), columns=list('abc'))
df1
Out[2]:
a b c
i 0 1 2
j 3 4 5
k 6 7 8
In [3]:
df5 = pd.DataFrame(np.arange(50, 56).reshape(2, 3), index=list('lm'), columns=list('abd'))
df5
Out[3]:
a b d
l 50 51 52
m 53 54 55

df1 y df5 tienen las columnas ay b en común pero tienen cada una columna propia

Unimos df1 y df5 por filas:

In [4]:
pd.concat([df1, df5])
Out[4]:
a b c d
i 0 1 2.0 NaN
j 3 4 5.0 NaN
k 6 7 8.0 NaN
l 50 51 NaN 52.0
m 53 54 NaN 55.0

concat ha unido las filas, completando con NaN las filas del DataFrame que no tienen valor en estas columnas

Podemos cambiar este comportamiento con el parámetro join¶

Por defecto, el parámetro join toma el valor 'outer', que implica que se queda con la unión de las columnas, completando con NaN donde faltan datos.

Si indicamos join='inner', sólo se preservan las columnas que ambos DataFrames tienen en común, descartando las que son exclusivas de uno o el otro;

In [5]:
pd.concat([df1, df5], join='inner')
Out[5]:
a b
i 0 1
j 3 4
k 6 7
l 50 51
m 53 54

Todo funciona de manera similar si unimos por columnas¶

El comportamiento de concat es simétrico por filas o por columnas.

In [6]:
# Recordad df1
df1
Out[6]:
a b c
i 0 1 2
j 3 4 5
k 6 7 8
In [7]:
# Introducimos ahora df6
df6 = pd.DataFrame(np.arange(60, 66).reshape(3, 2), index=list('ijl'), columns=list('de'))
df6
Out[7]:
d e
i 60 61
j 62 63
l 64 65

Unimos por columnas

In [8]:
pd.concat([df1, df6], axis=1)
Out[8]:
a b c d e
i 0.0 1.0 2.0 60.0 61.0
j 3.0 4.0 5.0 62.0 63.0
k 6.0 7.0 8.0 NaN NaN
l NaN NaN NaN 64.0 65.0

Si especificamos join='inner'

In [9]:
pd.concat([df1, df6], axis=1, join='inner')
Out[9]:
a b c d e
i 0 1 2 60 61
j 3 4 5 62 63