Suponha que eu tenha dois DataFrames como este:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Quero mesclá-los, então tento algo assim:
pd.merge(left, right, left_on='key1', right_on='key2')
E eu estou feliz
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Mas estou tentando usar o método join, no qual fui levado a acreditar que é bastante semelhante.
left.join(right, on=['key1', 'key2'])
E eu entendo isso:
//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:
o que estou perdendo?
merge
une colunas deleft
a colunas deright
, que é o que você deseja, masjoin(... on=[...])
une colunas deleft
a chaves de índice deright
, que não é o que você deseja. Veja minha resposta abaixo para mais detalhes.on
opção) com os índices do chamadorother
. Lembre-se, índices para associação. Enquanto merge () é um método mais genérico.Respostas:
Eu sempre uso
join
em índices:A mesma funcionalidade pode ser obtida usando
merge
as colunas a seguir:fonte
right
tenha a mesma profundidade que o comprimentoon
. Isso faz sentido para mim. Eu posso aceitar que a semântica é diferente. Mas eu gostaria de saber se eu posso obter esse mesmo comportamento com df.joinpandas.merge()
é a função subjacente usada para todo o comportamento de mesclagem / junção.Os DataFrames fornecem os métodos
pandas.DataFrame.merge()
epandas.DataFrame.join()
como uma maneira conveniente de acessar os recursos dopandas.merge()
. Por exemplo,df1.merge(right=df2, ...)
é equivalente apandas.merge(left=df1, right=df2, ...)
.Estas são as principais diferenças entre
df.join()
edf.merge()
:df1.join(df2)
sempre ingressa no índice dedf2
, masdf1.merge(df2)
pode ingressar em uma ou mais colunas dedf2
(padrão) ou no índice dedf2
(comright_index=True
).df1.join(df2)
usa o índice dedf1
edf1.merge(df2)
usa a (s) coluna (s) dedf1
. Isso pode ser substituído especificandodf1.join(df2, on=key_or_keys)
oudf1.merge(df2, left_index=True)
.df1.join(df2)
faz uma junção esquerda por padrão (mantém todas as linhas dedf1
), masdf.merge
faz uma junção interna por padrão (retorna apenas as linhas correspondentes dedf1
edf2
).Portanto, a abordagem genérica é usar
pandas.merge(df1, df2)
ordf1.merge(df2)
. Porém, em várias situações comuns (mantendo todas as linhasdf1
e ingressando em um índicedf2
), você pode salvar algumas digitações usandodf1.join(df2)
.Algumas notas sobre esses problemas da documentação em http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
fonte
on=key_or_keys
para alterar a maneira como as linhas são encontradas na tabela correta. No entanto, esse não é realmente o caso. Oon
argumento altera a pesquisa na tabela esquerda (df1
) do índice para a (s) coluna (s). No entanto, mesmo com esse argumento, a tabela correta (df2
) será correspondida por meio de seu índice. (Veja o último exemplo acima.)Eu acredito que
join()
é apenas um método de conveniência. Tente emdf1.merge(df2)
vez disso, o que permite especificarleft_on
eright_on
:fonte
A partir desta documentação
E:
fonte
Uma das diferenças é que
merge
está criando um novo índice ejoin
mantendo o índice do lado esquerdo. Pode ter uma grande consequência em suas transformações posteriores se você assumir erroneamente que seu índice não foi alteradomerge
.Por exemplo:
-
-
-
fonte
on
parâmetro tem um significado diferente nos dois casosfonte
Em termos análogos ao SQL "a mesclagem do Pandas é a junção externa / interna e a junção do Pandas é a junção natural". Portanto, quando você usa a mesclagem no pandas, deseja especificar que tipo de junção sqlish deseja usar, enquanto que ao usar a junção pandas, você realmente deseja ter um rótulo de coluna correspondente para garantir que ela se junte
fonte