python - inner - ¿Cuál es la diferencia entre join y merge en Pandas?
pandas python (4)
Creo que join()
es solo un método de conveniencia. Pruebe df1.merge(df2)
lugar, lo que le permite especificar left_on
y right_on
:
In [30]: left.merge(right, left_on="key1", right_on="key2")
Out[30]:
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
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, entonces 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?
Siempre uso join
en índices:
import pandas as pd
left = pd.DataFrame({''key'': [''foo'', ''bar''], ''val'': [1, 2]}).set_index(''key'')
right = pd.DataFrame({''key'': [''foo'', ''bar''], ''val'': [4, 5]}).set_index(''key'')
left.join(right, lsuffix=''_l'', rsuffix=''_r'')
val_l val_r
key
foo 1 4
bar 2 5
Se puede tener la misma funcionalidad al usar merge
en las columnas siguientes:
left = pd.DataFrame({''key'': [''foo'', ''bar''], ''val'': [1, 2]})
right = pd.DataFrame({''key'': [''foo'', ''bar''], ''val'': [4, 5]})
left.merge(right, on=(''key''), suffixes=(''_l'', ''_r''))
key val_l val_r
0 foo 1 4
1 bar 2 5
pandas proporciona una única función, fusionar, como punto de entrada para todas las operaciones de combinación de base de datos estándar entre objetos DataFrame:
merge (left, right, how = ''inner'', on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = True, sufijos = (''_ x'', ''_y''), copy = Verdadero, indicador = Falso)
Y:
DataFrame.join es un método conveniente para combinar las columnas de dos DataFrames potencialmente indexados de manera diferente en un solo DataFrame de resultados. Aquí hay un ejemplo muy básico: la alineación de datos aquí está en los índices (etiquetas de fila). Este mismo comportamiento se puede lograr usando fusionar más argumentos adicionales para que use los índices: result = pd.merge (left, right, left_index = True, right_index = True, how = ''outer'')
pandas.merge()
es la función subyacente utilizada para todo el comportamiento de fusión / unión.
DataFrames proporciona los pandas.DataFrame.merge()
y pandas.DataFrame.join()
como una forma conveniente de acceder a las capacidades de pandas.merge()
. Por ejemplo, df1.merge(right=df2, ...)
es equivalente a pandas.merge(left=df1, right=df2, ...)
.
Estas son las principales diferencias entre df.join()
y df.merge()
:
- búsqueda en la tabla derecha:
df1.join(df2)
siempre se une mediante el índice dedf2
, perodf1.merge(df2)
puede unirse a una o más columnas dedf2
(predeterminado) o al índice dedf2
(conright_index=True
) . - búsqueda en la tabla de la izquierda: de forma predeterminada,
df1.join(df2)
usa el índice dedf1
ydf1.merge(df2)
usa la (s) columna (s) dedf1
. Esto puededf1.join(df2, on=key_or_keys)
especificandodf1.join(df2, on=key_or_keys)
odf1.merge(df2, left_index=True)
. - combinación izquierda vs interna:
df1.join(df2)
hace una combinación izquierda por defecto (mantiene todas las filas dedf1
), perodf.merge
hace una unión interna por defecto (devuelve solo filas coincidentes dedf1
ydf2
).
Entonces, el enfoque genérico es usar pandas.merge(df1, df2)
o df1.merge(df2)
. Pero para una serie de situaciones comunes (mantener todas las filas de df1
y df1
a un índice en df2
), puede guardar algo de tipeo usando df1.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 :
merge
es una función en el espacio de nombres de los pandas, y también está disponible como un método de instancia de DataFrame, y el DataFrame llamante se considera implícitamente como el objeto izquierdo de la unión.El método
DataFrame.join
relacionado utilizamerge
internamente para lasDataFrame.join
index-on-index e index-on-column (s), pero se une a los índices de forma predeterminada en lugar de intentar unirse en columnas comunes (el comportamiento predeterminado paramerge
). Si se está uniendo al índice, puede usarDataFrame.join
para ahorrarse algunosDataFrame.join
.
...
Estas dos llamadas a funciones son completamente equivalentes:
left.join(right, on=key_or_keys) pd.merge(left, right, left_on=key_or_keys, right_index=True, how=''left'', sort=False)