DataFrame
s 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
# Preliminares
import pandas as pd
import numpy as np
Consideramos los dos DataFrame
s:
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index=list('ijk'), columns=list('abc'))
df1
a | b | c | |
---|---|---|---|
i | 0 | 1 | 2 |
j | 3 | 4 | 5 |
k | 6 | 7 | 8 |
df5 = pd.DataFrame(np.arange(50, 56).reshape(2, 3), index=list('lm'), columns=list('abd'))
df5
a | b | d | |
---|---|---|---|
l | 50 | 51 | 52 |
m | 53 | 54 | 55 |
df1
ydf5
tienen las columnasa
yb
en común pero tienen cada una columna propia
Unimos df1
y df5
por filas:
pd.concat([df1, df5])
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 conNaN
las filas delDataFrame
que no tienen valor en estas columnas
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 ambosDataFrame
s tienen en común, descartando las que son exclusivas de uno o el otro;
pd.concat([df1, df5], join='inner')
a | b | |
---|---|---|
i | 0 | 1 |
j | 3 | 4 |
k | 6 | 7 |
l | 50 | 51 |
m | 53 | 54 |
El comportamiento de concat
es simétrico por filas o por columnas.
# Recordad df1
df1
a | b | c | |
---|---|---|---|
i | 0 | 1 | 2 |
j | 3 | 4 | 5 |
k | 6 | 7 | 8 |
# Introducimos ahora df6
df6 = pd.DataFrame(np.arange(60, 66).reshape(3, 2), index=list('ijl'), columns=list('de'))
df6
d | e | |
---|---|---|
i | 60 | 61 |
j | 62 | 63 |
l | 64 | 65 |
Unimos por columnas
pd.concat([df1, df6], axis=1)
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'
pd.concat([df1, df6], axis=1, join='inner')
a | b | c | d | e | |
---|---|---|---|---|---|
i | 0 | 1 | 2 | 60 | 61 |
j | 3 | 4 | 5 | 62 | 63 |