J'ai un Series
objet pandas contenant des valeurs booléennes. Comment puis-je obtenir une série contenant la logique NOT
de chaque valeur?
Par exemple, considérons une série contenant:
True
True
True
False
La série que j'aimerais obtenir contiendrait:
False
False
False
True
Cela semble être assez simple, mais apparemment, j'ai égaré mon mojo = (
object
types pour que les réponses ci-dessous fonctionnent, alors utilisez:~ df.astype('bool')
Réponses:
Pour inverser une série booléenne, utilisez
~s
:En utilisant Python2.7, NumPy 1.8.0, Pandas 0.13.1:
Depuis Pandas 0.13.0, les séries ne sont plus des sous-classes de
numpy.ndarray
; ce sont maintenant des sous-classes depd.NDFrame
. Cela pourrait avoir quelque chose à voir avec pourquoinp.invert(s)
n'est plus aussi rapide que~s
ou-s
.Avertissement: les
timeit
résultats peuvent varier en fonction de nombreux facteurs, notamment le matériel, le compilateur, le système d'exploitation, les versions Python, NumPy et Pandas.la source
-
?tilde
comme il était mentionné dans la documentation, mais il n'a pas fonctionné de la même manière quenp.invert
: Snp.invert(s)
,~s
et-s
sont tous les mêmes.np.bitwise_not(s)
fonctionne de la même manière quenp.inverse
).La réponse de @ unutbu est parfaite, je voulais juste ajouter un avertissement que votre masque doit être dtype bool, pas 'object'. C'est-à-dire que votre masque ne doit jamais avoir de nan. Voyez ici - même si votre masque est maintenant sans nanos, il restera de type «objet».
L'inverse d'une série `` objet '' ne générera pas d'erreur, à la place, vous obtiendrez un masque d'ordures d'entiers qui ne fonctionnera pas comme prévu.
Après avoir parlé à mes collègues de celui-ci, j'ai une explication: il semble que les pandas reviennent à l'opérateur au niveau du bit:
Comme le dit @geher, vous pouvez le convertir en bool avec astype avant d'inverser avec ~
la source
.astype(bool)
par exemple~df['A'].astype(bool)
astype(bool)
se passe avant le~
~df['A'].astype(bool)
vs(~df['A']).astype(bool)
Je lui donne juste un coup de feu:
la source
-
! Je garderai cela à l'esprit pour la prochaine fois.Vous pouvez également utiliser
numpy.invert
:EDIT: La différence de performances apparaît sur Ubuntu 12.04, Python 2.7, NumPy 1.7.0 - ne semble cependant pas exister avec NumPy 1.6.2:
la source
NumPy est plus lent car il convertit l'entrée en valeurs booléennes (donc None et 0 devient False et tout le reste devient True).
vous donne
alors que ~ s planterait. Dans la plupart des cas, le tilde serait un choix plus sûr que NumPy.
Pandas 0,25, NumPy 1,17
la source