Supongamos que tengo dos DataFrames así:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Quiero fusionarlos, así que intento algo como esto:
pd.merge(left, right, left_on='key1', right_on='key2')
Y estoy feliz
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Pero estoy tratando de usar el método de unión, que me han hecho creer que es bastante similar.
left.join(right, on=['key1', 'key2'])
Y entiendo esto:
//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406 if self.right_index:
407 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408 raise AssertionError()
409 self.right_on = [None] * n
410 elif self.right_on is not None:
AssertionError:
¿Qué me estoy perdiendo?
merge
une columnas deleft
a columnas deright
, que es lo que desea, perojoin(... on=[...])
une columnas deleft
claves de índice deright
, que no es lo que desea. Vea mi respuesta a continuación para más detalles.on
opción) con losother
índices de 's. Recuerde, índices para unirse. Mientras que merge () es un método más genérico.Respuestas:
Siempre uso
join
en índices:Se puede tener la misma funcionalidad usando
merge
las siguientes columnas:fuente
right
sea de la misma profundidad que la longitudon
. Eso tiene sentido para mí. Puedo aceptar que la semántica es diferente. Pero me gustaría saber si puedo conseguir que el mismo comportamiento con df.joinpandas.merge()
es la función subyacente utilizada para todos los comportamientos de fusión / unión.Los marcos de datos proporcionan los métodos
pandas.DataFrame.merge()
ypandas.DataFrame.join()
como una forma conveniente de acceder a las capacidades depandas.merge()
. Por ejemplo,df1.merge(right=df2, ...)
es equivalente apandas.merge(left=df1, right=df2, ...)
.Estas son las principales diferencias entre
df.join()
ydf.merge()
:df1.join(df2)
siempre se une a través del índice dedf2
, perodf1.merge(df2)
puede unirse a una o más columnas dedf2
(predeterminado) o al índice dedf2
(conright_index=True
).df1.join(df2)
usa el índicedf1
y lasdf1.merge(df2)
columnas dedf1
. Eso se puede anular especificandodf1.join(df2, on=key_or_keys)
odf1.merge(df2, left_index=True)
.df1.join(df2)
realiza una combinación izquierda de forma predeterminada (mantiene todas las filas dedf1
), perodf.merge
una combinación interna de forma predeterminada (solo devuelve filas coincidentes dedf1
ydf2
).Entonces, el enfoque genérico es usar
pandas.merge(df1, df2)
odf1.merge(df2)
. Pero para una serie de situaciones comunes (mantener todas las filasdf1
y unirse a un índicedf2
), puede guardar algo de tipeo utilizando en sudf1.join(df2)
lugar.Algunas notas sobre estos temas de la documentación en http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
fuente
on=key_or_keys
para cambiar la forma en que se encuentran las filas en la tabla correcta. Sin embargo, ese no es realmente el caso. Elon
argumento cambia la búsqueda en la tabla izquierda (df1
) de índice a columna (s). Sin embargo, incluso con este argumento, la tabla correcta (df2
) se comparará a través de su índice. (Vea el último ejemplo anterior.)Creo que
join()
es solo un método de conveniencia. Pruebe en sudf1.merge(df2)
lugar, lo que le permite especificarleft_on
yright_on
:fuente
De esta documentación
Y:
fuente
Una de las diferencias es que
merge
está creando un nuevo índice yjoin
está manteniendo el índice del lado izquierdo. Puede tener una gran consecuencia en sus transformaciones posteriores si asume erróneamente que su índice no cambia conmerge
.Por ejemplo:
-
-
-
fuente
on
parámetro tiene un significado diferente en ambos casosfuente
Para decirlo de manera análoga a SQL "La fusión de Pandas es una unión externa / interna y la unión de Pandas es una unión natural". Por lo tanto, cuando usa la combinación en pandas, desea especificar qué tipo de combinación sqlish desea usar, mientras que cuando usa la combinación de pandas, realmente desea tener una etiqueta de columna coincidente para asegurarse de que se una
fuente