Agradeceríamos tu ayuda para compartir nuestros enunciados en referencia a las ciencias de la computación.
Solución:
Para invertir una serie booleana, use ~s
:
In [7]: s = pd.Series([True, True, False, True])
In [8]: ~s
Out[8]:
0 False
1 False
2 True
3 False
dtype: bool
Usando Python2.7, NumPy 1.8.0, Pandas 0.13.1:
In [119]: s = pd.Series([True, True, False, True]*10000)
In [10]: %timeit np.invert(s)
10000 loops, best of 3: 91.8 µs per loop
In [11]: %timeit ~s
10000 loops, best of 3: 73.5 µs per loop
In [12]: %timeit (-s)
10000 loops, best of 3: 73.5 µs per loop
A partir de Pandas 0.13.0, las Series ya no son subclases de numpy.ndarray
; ahora son subclases de pd.NDFrame
. Esto podría tener algo que ver con el por qué np.invert(s)
ya no es tan rápido como ~s
o -s
.
Advertencia: timeit
los resultados pueden variar según muchos factores, incluidos el hardware, el compilador, las versiones del sistema operativo, Python, NumPy y Pandas.
La respuesta de @unutbu es acertada, solo quería agregar una advertencia de que su máscara debe ser tipo d bool, no ‘objeto’. Es decir, tu máscara no puede tener alguna vez tenía cualquier nan. Vea aquí: incluso si su máscara está libre de nan ahora, seguirá siendo del tipo ‘objeto’.
El inverso de una serie de ‘objetos’ no generará un error, sino que obtendrá una máscara de basura de ints que no funcionará como espera.
In[1]: df = pd.DataFrame('A':[True, False, np.nan], 'B':[True, False, True])
In[2]: df.dropna(inplace=True)
In[3]: df['A']
Out[3]:
0 True
1 False
Name: A, dtype object
In[4]: ~df['A']
Out[4]:
0 -2
0 -1
Name: A, dtype object
Después de hablar con colegas sobre esto, tengo una explicación: parece que pandas está volviendo al operador bit a bit:
In [1]: ~True
Out[1]: -2
Como dice @geher, puedes convertirlo a bool con un tipo antes de invertir con ~
~df['A'].astype(bool)
0 False
1 True
Name: A, dtype: bool
(~df['A']).astype(bool)
0 True
1 True
Name: A, dtype: bool
Solo le doy una oportunidad:
In [9]: s = Series([True, True, True, False])
In [10]: s
Out[10]:
0 True
1 True
2 True
3 False
In [11]: -s
Out[11]:
0 False
1 False
2 False
3 True
Comentarios y puntuaciones
Recuerda algo, que puedes decir si encontraste tu contratiempo .