Comparación de valores lógicos con NaN en pandas / numpy
Quiero hacer una operación OR basada en elementos en dos series pandas de valores booleanos.np.nan
s también están incluidos.
He intentado tres enfoques y me di cuenta de que la expresión "np.nan
oFalse
"se puede evaluar paraTrue
, False
ynp.nan
Dependiendo del enfoque.
Estas son mis series de ejemplo:
series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])
Enfoque n. ° 1Utilizando la|
operador de pandas:
In [5]: series_1 | series_2
Out[5]:
0 True
1 False
2 False
dtype: bool
Enfoque n. ° 2Utilizando lalogical_or
función de numpy:
In [6]: np.logical_or(series_1, series_2)
Out[6]:
0 True
1 False
2 NaN
dtype: object
Enfoque n. ° 3Defino una versión vectorizada delogical_or
que se supone que debe evaluarse fila por fila sobre las matrices:
@np.vectorize
def vectorized_or(a, b):
return np.logical_or(a, b)
yo suelovectorized_or
en las dos series y convertir su salida (que es una matriz numpy) en una serie de pandas:
In [8]: pd.Series(vectorized_or(series_1, series_2))
Out[8]:
0 True
1 False
2 True
dtype: bool
PreguntaMe pregunto las razones de estos resultados.
Esta respuesta explicanp.logical_or
y dicenp.logical_or(np.nan, False)
es serTrue
pero ¿por qué esto solo funciona cuando está vectorizado y no en el Enfoque n. ° 2? ¿Y cómo se pueden explicar los resultados del Enfoque n. ° 1?