Fusionar dos marcos de datos por índice
Tengo los siguientes marcos de datos:
> df1
id begin conditional confidence discoveryTechnique
0 278 56 false 0.0 1
1 421 18 false 0.0 1
> df2
concept
0 A
1 B
¿Cómo fusiono los índices para obtener:
id begin conditional confidence discoveryTechnique concept
0 278 56 false 0.0 1 A
1 421 18 false 0.0 1 B
Lo pregunto porque tengo entendido que, es merge()
decir, df1.merge(df2)
utiliza columnas para hacer la comparación. De hecho, al hacer esto obtengo:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
self._validate_specification()
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on
¿Es una mala práctica fusionarse en el índice? ¿Es imposible? Si es así, ¿cómo puedo cambiar el índice a una nueva columna llamada "índice"?
Use merge
, que es una unión interna por defecto:
pd.merge(df1, df2, left_index=True, right_index=True)
O join
, que es una unión izquierda por defecto:
df1.join(df2)
O concat
, que es una unión externa por defecto:
pd.concat([df1, df2], axis=1)
Muestras :
df1 = pd.DataFrame({'a':range(6),
'b':[5,3,6,9,2,4]}, index=list('abcdef'))
print (df1)
a b
a 0 5
b 1 3
c 2 6
d 3 9
e 4 2
f 5 4
df2 = pd.DataFrame({'c':range(4),
'd':[10,20,30, 40]}, index=list('abhi'))
print (df2)
c d
a 0 10
b 1 20
h 2 30
i 3 40
# Default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
a b c d
a 0 5 0 10
b 1 3 1 20
# Default left join
df4 = df1.join(df2)
print (df4)
a b c d
a 0 5 0.0 10.0
b 1 3 1.0 20.0
c 2 6 NaN NaN
d 3 9 NaN NaN
e 4 2 NaN NaN
f 5 4 NaN NaN
# Default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
a b c d
a 0.0 5.0 0.0 10.0
b 1.0 3.0 1.0 20.0
c 2.0 6.0 NaN NaN
d 3.0 9.0 NaN NaN
e 4.0 2.0 NaN NaN
f 5.0 4.0 NaN NaN
h NaN NaN 2.0 30.0
i NaN NaN 3.0 40.0
Puede utilizar concat([df1, df2, ...], axis=1) para concatenar dos o más DF alineados por índices:
pd.concat([df1, df2, df3, ...], axis=1)
O fusionar para concatenar por campos/índices personalizados:
# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])
# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)
o unirse para unirse por índice:
df1.join(df2)
Esta respuesta se resolvió por un tiempo y todas las opciones disponibles ya están disponibles. Sin embargo, en esta respuesta intentaré arrojar un poco más de luz sobre estas opciones para ayudarle a comprender cuándo usar qué.
Esta publicación abordará los siguientes temas:
- Fusionarse con el índice en diferentes condiciones
- opciones para uniones basadas en índices:
merge
,join
,concat
- fusionándose en índices
- fusionándose en el índice de uno, columna de otro
- opciones para uniones basadas en índices:
- uso eficaz de índices con nombre para simplificar la sintaxis de fusión
Uniones basadas en índices
TL;DR
Hay algunas opciones, algunas más simples que otras según el caso de uso.
DataFrame.merge
conleft_index
yright_index
(oleft_on
yright_on
usando índices con nombre)DataFrame.join
(se une al índice)pd.concat
(se une al índice)
PROS | CONTRAS | |
---|---|---|
merge |
• admite uniones interior/izquierda/derecha/completa |
• sólo puede unir dos fotogramas a la vez |
join |
• admite interior/izquierdo (predeterminado)/derecho/completo |
• sólo admite uniones índice-índice |
concat |
• se especializa en unir múltiples DataFrames a la vez |
• solo admite uniones internas/completas (predeterminadas) |
Uniones de índice a índice
Normalmente, una unión interna en un índice tendría este aspecto:
left.merge(right, left_index=True, right_index=True)
Otros tipos de uniones (izquierda, derecha, exterior) siguen una sintaxis similar (y se pueden controlar mediante how=...
).
Alternativas notables
DataFrame.join
El valor predeterminado es una unión externa izquierda en el índice.left.join(right, how='inner',)
Si obtiene
ValueError: columns overlap but no suffix specified
, deberá especificarlsuffix
argumentosrsuffix=
para resolverlo. Dado que los nombres de las columnas son los mismos, se requiere un sufijo diferenciador.pd.concat
se une al índice y puede unir dos o más DataFrames a la vez. Realiza una unión externa completa de forma predeterminada.pd.concat([left, right], axis=1, sort=False)
Para obtener más información sobre
concat
, consulte esta publicación .
Índice de uniones de columnas
Para realizar una unión interna usando el índice de la izquierda y la columna de la derecha, usará DataFrame.merge
una combinación de left_index=True
y right_on=...
.
left.merge(right, left_index=True, right_on='key')
Otras uniones siguen una estructura similar. Tenga en cuenta que solo merge
se pueden realizar uniones de índice a columna. Puede unirse en varios niveles/columnas, siempre que el número de niveles de índice de la izquierda sea igual al número de columnas de la derecha.
join
y concat
no son capaces de realizar fusiones mixtas. Deberá configurar el índice como paso previo usando DataFrame.set_index
.
Esta publicación es una versión abreviada de mi trabajo en Pandas Merging 101 . Siga este enlace para obtener más ejemplos y otros temas sobre la fusión.