Comparando valores lógicos com NaN em pandas / numpy
Eu quero fazer uma operação OR elemento a elemento em dois pandas Série de valores booleanos.np.nan
s também estão incluídos.
Eu tentei três abordagens e percebi que a expressão "np.nan
ouFalse
"pode ser avaliado paraTrue
, False
enp.nan
dependendo da abordagem.
Estes são os meus exemplos de séries:
series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])
Abordagem # 1Usando o|
operador de pandas:
In [5]: series_1 | series_2
Out[5]:
0 True
1 False
2 False
dtype: bool
Abordagem # 2Usando ological_or
função de numpy:
In [6]: np.logical_or(series_1, series_2)
Out[6]:
0 True
1 False
2 NaN
dtype: object
Abordagem # 3Eu defino uma versão vetorizada delogical_or
que deve ser avaliado linha por linha sobre as matrizes:
@np.vectorize
def vectorized_or(a, b):
return np.logical_or(a, b)
eu usovectorized_or
nas duas séries e converta sua saída (que é uma matriz numpy) em uma série de pandas:
In [8]: pd.Series(vectorized_or(series_1, series_2))
Out[8]:
0 True
1 False
2 True
dtype: bool
Pergunta, questãoEu estou querendo saber sobre as razões para estes resultados.
Esta resposta explicanp.logical_or
e dissenp.logical_or(np.nan, False)
é serTrue
mas por que isso funciona apenas quando vetorizado e não na abordagem nº 2? E como os resultados da Abordagem nº 1 podem ser explicados?