Gostaria de mesclar dois DataFrames
e manter o índice do primeiro quadro como o índice no conjunto de dados mesclado. No entanto, quando faço a mesclagem, o DataFrame resultante possui um índice inteiro. Como posso especificar que quero manter o índice do quadro de dados esquerdo?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
EDIT: Mudou para o código de exemplo que pode ser facilmente reproduzido
Respostas:
Nota: para algumas operações de mesclagem à esquerda, você pode acabar com mais linhas se houver várias correspondências entre
a
eb
será necessário deduplicar ( documentação para deduplicação ). É por isso que os pandas não mantêm o índice para você.fonte
a
quadro original . reset_index move o índice para uma coluna regular e set_index dessa coluna após a mesclagem também cuida quando as linhas de uma são duplicadas / removidas devido à operação de mesclagem.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Você pode fazer uma cópia do índice no quadro de dados esquerdo e mesclar.
Achei esse método simples muito útil ao trabalhar com um dataframe grande e usando
pd.merge_asof()
(oudd.merge_asof()
).Essa abordagem seria superior quando a redefinição do índice for cara (dataframe grande).
fonte
Existe uma solução não-pd.merge. Usando
map
eset_index
E, não introduz um
index
nome fictício para o índice.fonte
pd.Dataframe
e não apd.Series
. O.map()
método é definido apenas para opd.Series
. Isso significa que:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
não funcionará.Isso permite preservar o índice de df1
fonte
on=list_of_cols]
, ela contradiz a documentação:If joining columns on columns, the DataFrame indexes *will be ignored*
. Um dos índices ou colunas tem precedência?Acho que criei uma solução diferente. Eu estava ingressando na tabela esquerda no valor do índice e na tabela direita em um valor da coluna com base no índice da tabela esquerda. O que eu fiz foi uma mesclagem normal:
Em seguida, recuperei os novos números de índice da tabela mesclada e os coloquei em uma nova coluna denominada Número da linha de sentimento:
Em seguida, defino manualmente o índice de volta ao índice original da tabela esquerda, com base na coluna preexistente chamada Número da linha (o valor da coluna em que ingressei no índice da tabela esquerda):
Em seguida, remova o nome do índice do número da linha para que permaneça em branco:
Talvez um pouco de hack, mas parece funcionar bem e relativamente simples. Além disso, acho que reduz o risco de duplicar / atrapalhar seus dados. Espero que tudo faça sentido.
fonte
Outra opção simples é renomear o índice para o que era antes:
A mesclagem preserva a ordem no dataframe 'a', mas apenas redefine o índice para que seja salvo o uso de set_axis
fonte