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?

mergeune columnas delefta columnas deright, que es lo que desea, perojoin(... on=[...])une columnas deleftclaves de índice deright, que no es lo que desea. Vea mi respuesta a continuación para más detalles.onopción) con losotheríndices de 's. Recuerde, índices para unirse. Mientras que merge () es un método más genérico.Respuestas:
Siempre uso
joinen índices:Se puede tener la misma funcionalidad usando
mergelas siguientes columnas:fuente
rightsea 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 índicedf1y 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.mergeuna combinación interna de forma predeterminada (solo devuelve filas coincidentes dedf1ydf2).Entonces, el enfoque genérico es usar
pandas.merge(df1, df2)odf1.merge(df2). Pero para una serie de situaciones comunes (mantener todas las filasdf1y 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_keyspara cambiar la forma en que se encuentran las filas en la tabla correcta. Sin embargo, ese no es realmente el caso. Elonargumento 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_onyright_on:fuente
De esta documentación
Y:
fuente
Una de las diferencias es que
mergeestá creando un nuevo índice yjoinestá 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
onpará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