Saltar al contenido

¿Cómo puedo obtener el elemento lógico NO de una serie de pandas?

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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *