Valores de remapso na coluna pandas com um ditado
Tenho um dicionário que se parece com este: `di = {1: "A", 2: "B"}``
Gostaria de o aplicar ao "col1" coluna de um dataframe semelhante ao ":
col1 col2
0 w a
1 1 2
2 2 NaN
para obter:
col1 col2
0 w a
1 A 2
2 B NaN
Como posso fazer isto da melhor forma? Por alguma razão, o googling de termos relacionados com isto apenas me mostra links sobre como fazer colunas de pictos e vice-versa :-/
257
3
Pode utilizar
.substituir
. Por exemplo:ou directamente na Série, ou seja,
df["col1"].replace(di, inplace=True)
.mapa
pode ser muito mais rápido do quesubstituir
Se o seu dicionário tiver mais do que um par de chaves, utilizar "mapa" pode ser muito mais rápido do que "substituir". Existem duas versões desta abordagem, dependendo se o seu dicionário mapeia exaustivamente todos os valores possíveis (e também se pretende que os valores não correspondentes sejam mantidos ou convertidos para NaNs):
Mapeamento Exaustivo
Neste caso, o formulário é muito simples:
Embora o "mapa" tome mais frequentemente uma função como argumento, pode alternativamente tomar um dicionário ou uma série de dicionários: Documentação para Pandas.series.map
Mapeamento não-Exaustivo
Se tiver um mapeamento não exaustivo e desejar reter as variáveis existentes para não correspondências, pode adicionar
fillna
:como em @jpp's resposta aqui: https://stackoverflow.com/questions/49259580/replace-values-in-a-pandas-series-via-dictionary-efficiently
Benchmarks
Utilizando os seguintes dados com pandas versão 0.23.1:
e testes com "%timeit", parece que "mapa" é aproximadamente 10x mais rápido do que "substituir".
Note que a sua velocidade com "mapa" variará com os seus dados. A maior velocidade parece ser com grandes dicionários e substitutos exaustivos. Ver resposta @jpp (ligada acima) para referências e discussão mais extensiva.
Há um pouco de ambiguidade na sua pergunta. Há pelo menos três duas interpretações:
di' referem-se a
df['col1']`valoresAbaixo está uma solução para cada caso.
Caso 1: Se as chaves de
di
se destinarem a referir-se a valores de índice, então poderá utilizar o métodoupdate
:Por exemplo,
rendimentos
I'modifiquei os valores do seu post original para que fique mais claro o que a
actualização
está a fazer. Note como as chaves emdi
estão associadas aos valores do índice. A ordem dos valores do índice -- ou seja, o índice localizações -- não importa.Caso 2: Se as chaves em
di' se referirem a
df['col1']valores, então @DanAllan e @DSM mostram como conseguir isto com
replace`:rendimentos
Note como, neste caso, as chaves em
di
foram alteradas para corresponder a valores em `df['col1']``.Caso 3: Se as teclas em
di
se referirem a locais de índice, então poderá utilizardesde
rendimentos
Aqui, a primeira e terceira filas foram alteradas, porque as chaves em
di
são0
e2
, que com Python's 0 baseado na indexação se referem à primeira e terceira localizações.