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
# Preliminares
import pandas as pd
import numpy as np
Consideramos los dos DataFrames:
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 |
df1ydf5tienen las columnasayben 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 |
concatha unido las filas, completando conNaNlas filas delDataFrameque 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 ambosDataFrames 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 |