Consultando por NaN y otros nombres en Pandas

Digamos que tengo un df dataframe con un value columna value contiene algunos valores flotantes y algunos NaN . ¿Cómo puedo obtener la parte del dataframe donde tenemos NaN usando la syntax de consulta ?

Lo siguiente, por ejemplo, no funciona:

 df.query( '(value < 10) or (value == NaN)' ) 

Obtengo el name NaN is not defined (igual para df.query('value ==NaN') )

En términos generales, ¿hay alguna forma de usar nombres numpy en la consulta, como inf , nan , pi , e , etc.?

En general, podrías usar @local_variable_name , así que algo como

 >>> pi = np.pi; nan = np.nan >>> df = pd.DataFrame({"value": [3,4,9,10,11,np.nan,12]}) >>> df.query("(value < 10) and (value > @pi)") value 1 4 2 9 

funcionaría, pero nan no es igual a sí mismo, por lo que value == NaN siempre será falso. Una forma de solucionar esto es usar ese hecho y usar value != value isnan como una comprobación de isnan . Tenemos

 >>> df.query("(value < 10) or (value == @nan)") value 0 3 1 4 2 9 

pero

 >>> df.query("(value < 10) or (value != value)") value 0 3 1 4 2 9 5 NaN 

Según esta respuesta puedes usar:

 df.query('value < 10 | value.isnull()', engine='python') 

He comprobado que funciona.

Para filas donde el value no es nulo

 df.query("value == value") 

Para filas donde el value es nulo

 df.query("value != value")