Eu gostaria de acrescentar uma string ao início de cada valor em uma coluna de um dataframe pandas (elegantemente). Já descobri como fazer isso e atualmente estou usando:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Isso parece uma coisa muito deselegante de se fazer - você conhece alguma outra maneira (que talvez também adicione o caractere às linhas em que a coluna é 0 ou NaN)?
Caso isso ainda não esteja claro, gostaria de virar:
col
1 a
2 0
para dentro:
col
1 stra
2 str0
!= False
negócio? Você quer agregarstr
a todos os valores ou apenas a alguns?df['col'] = 'str' + df['col'].astype(str)
?Respostas:
Exemplo:
fonte
Como alternativa, você também pode usar um
apply
combinado comformat
(ou melhor, com f-strings) que considero um pouco mais legível se alguém, por exemplo, também quiser adicionar um sufixo ou manipular o próprio elemento:que também produz a saída desejada:
Se estiver usando o Python 3.6+, você também pode usar f-strings:
produzindo a mesma saída.
A versão da string f é quase tão rápida quanto a solução de @RomanPekar (python 3.6.4):
Usar
format
, no entanto, é realmente muito mais lento:fonte
format
na verdade, tem um desempenho pior. Como você se compara?.apply
é sempre tão rápido ou mais lento do que as operações vetorizadas "diretas"; mesmo que não sejam mais lentos, prefiro evitá-los sempre que possível.x
mesmo etc., mas isso é apenas uma questão de gosto ... :)Você pode usar o pandas.Series.map:
Ele aplicará a palavra "str" antes de todos os seus valores.
fonte
Se você carregar seu arquivo de tabela
dtype=str
ou converter o tipo de coluna em string
df['a'] = df['a'].astype(str)
, poderá usar essa abordagem:
Esta abordagem permite prefixar, acrescentar e subconjunto de strings de
df
.Funciona no Pandas v0.23.4, v0.24.1. Não sei sobre as versões anteriores.
fonte
Outra solução com .loc:
Isso não é tão rápido quanto as soluções acima (> 1 ms por loop mais lento), mas pode ser útil no caso de você precisar de mudança condicional, como:
fonte
.index
emdf[mask].index
?df.loc[mask]
funcionar, e funciona, então.index
é supérfluo, certo?