Tengo un Series
objeto pandas que contiene valores booleanos. ¿Cómo puedo obtener una serie que contenga la lógica NOT
de cada valor?
Por ejemplo, considere una serie que contiene:
True
True
True
False
La serie que me gustaría obtener contendría:
False
False
False
True
Parece que debería ser razonablemente simple, pero aparentemente he perdido mi mojo = (
object
tipos para que las respuestas a continuación funcionen, así que use:~ df.astype('bool')
Respuestas:
Para invertir una serie booleana, use
~s
:Usando Python2.7, NumPy 1.8.0, Pandas 0.13.1:
A partir de Pandas 0.13.0, las series ya no son subclases de
numpy.ndarray
; ahora son subclases depd.NDFrame
. Esto podría tener algo que ver con por quénp.invert(s)
ya no es tan rápido como~s
o-s
.Advertencia: los
timeit
resultados pueden variar según muchos factores, incluidas las versiones de hardware, compilador, sistema operativo, Python, NumPy y Pandas.fuente
-
?tilde
como se menciona en la documentación, pero no funcionó igual quenp.invert
: Snp.invert(s)
,~s
y-s
son todos iguales.np.bitwise_not(s)
funciona igual quenp.inverse
).La respuesta de @unutbu es acertada, solo quería agregar una advertencia de que su máscara debe ser dtype bool, no 'object'. Es decir, su máscara no puede haber nunca tenido ninguna de Nan. Vea aquí , incluso si su máscara no tiene nan ahora, seguirá siendo del tipo 'objeto'.
El inverso de una serie de 'objetos' no arrojará un error, sino que obtendrá una máscara de basura que no funcionará como espera.
Después de hablar con colegas sobre este tema, tengo una explicación: parece que los pandas están volviendo al operador bit a bit:
Como dice @geher, puede convertirlo en bool con un tipo antes de invertir con ~
fuente
.astype(bool)
ejemplo~df['A'].astype(bool)
astype(bool)
está sucediendo antes del~
~df['A'].astype(bool)
vs(~df['A']).astype(bool)
Solo le doy una oportunidad:
fuente
-
! Lo tendré en cuenta para la próxima vez.También puedes usar
numpy.invert
:EDITAR: La diferencia en el rendimiento aparece en Ubuntu 12.04, Python 2.7, NumPy 1.7.0, aunque no parece existir usando NumPy 1.6.2:
fuente
NumPy es más lento porque convierte la entrada en valores booleanos (por lo que None y 0 se convierten en False y todo lo demás se convierte en True).
te dio
mientras que ~ s se estrellaría. En la mayoría de los casos, tilde sería una opción más segura que NumPy.
Pandas 0.25, NumPy 1.17
fuente