Eu tenho um Series
objeto pandas contendo valores booleanos. Como posso obter uma série contendo a lógica NOT
de cada valor?
Por exemplo, considere uma série contendo:
True
True
True
False
A série que eu gostaria de obter conteria:
False
False
False
True
Parece que deve ser razoavelmente simples, mas aparentemente eu perdi meu mojo = (
object
tipos para as respostas abaixo funcionarem, portanto, use:~ df.astype('bool')
Respostas:
Para inverter uma série booleana, use
~s
:Usando Python2.7, NumPy 1.8.0, Pandas 0.13.1:
A partir do Pandas 0.13.0, as séries não são mais subclasses de
numpy.ndarray
; agora são subclasses depd.NDFrame
. Isso pode ter algo a ver com o porquênp.invert(s)
não é mais tão rápido quanto~s
ou-s
.Advertência: os
timeit
resultados podem variar dependendo de muitos fatores, incluindo versões de hardware, compilador, SO, Python, NumPy e Pandas.fonte
-
?tilde
que foi mencionado na documentação, mas ele não executou o mesmo quenp.invert
: Snp.invert(s)
,~s
e-s
são todos iguais.np.bitwise_not(s)
executa o mesmo quenp.inverse
).A resposta do @ unutbu é imediata, só queria adicionar um aviso de que sua máscara precisa ser do tipo bool, não 'objeto'. Ou seja, sua máscara nunca pode ter nan. Veja aqui - mesmo que sua máscara não esteja nan agora, ela permanecerá do tipo 'objeto'.
O inverso de uma série de 'objetos' não gera um erro; em vez disso, você recebe uma máscara de lixo de ints que não funcionará conforme o esperado.
Depois de conversar com colegas sobre este, tenho uma explicação: Parece que os pandas estão revertendo para o operador bit a bit:
Como @geher diz, você pode convertê-lo em booleano com astype antes de inverter com ~
fonte
.astype(bool)
exemplo~df['A'].astype(bool)
astype(bool)
está acontecendo antes do~
~df['A'].astype(bool)
vs(~df['A']).astype(bool)
Eu apenas dou uma chance:
fonte
-
! Vou manter isso em mente para a próxima vez.Você também pode usar
numpy.invert
:EDIT: A diferença de desempenho aparece no Ubuntu 12.04, Python 2.7, NumPy 1.7.0 - parece não existir usando o NumPy 1.6.2:
fonte
O NumPy é mais lento porque converte a entrada em valores booleanos (portanto, Nenhum e 0 se tornam Falso e todo o resto se torna Verdadeiro).
da-te
enquanto ~ s iria falhar. Na maioria dos casos, til seria uma escolha mais segura que o NumPy.
Pandas 0,25, NumPy 1,17
fonte