Vergleicht logische Werte mit NaN in pandas / numpy
Ich möchte eine elementweise ODER-Operation für zwei Pandas-Reihen von Booleschen Werten ausführen.np.nan
s sind ebenfalls enthalten.
ch habe drei Ansätze ausprobiert und festgestellt, dass der Ausdruck "np.nan
oderFalse
"kann zu @ ausgewertet werdTrue
, False
, undnp.nan
je nach ansatz.
Das sind meine Beispielserien:
series_1 = pd.Series([True, False, np.nan])
series_2 = pd.Series([False, False, False])
Ansatz # 1Verwendung der|
Betreiber von Pandas:
In [5]: series_1 | series_2
Out[5]:
0 True
1 False
2 False
dtype: bool
Ansatz 2Verwendung derlogical_or
Funktion von numpy:
In [6]: np.logical_or(series_1, series_2)
Out[6]:
0 True
1 False
2 NaN
dtype: object
Ansatz 3Ich definiere eine vektorisierte Version vonlogical_or
, das zeilenweise über die Arrays ausgewertet werden soll:
@np.vectorize
def vectorized_or(a, b):
return np.logical_or(a, b)
Ich benutzevectorized_or
auf den beiden Serien und konvertieren Sie seine Ausgabe (die ein Numpy-Array ist) in eine Pandas-Serie:
In [8]: pd.Series(vectorized_or(series_1, series_2))
Out[8]:
0 True
1 False
2 True
dtype: bool
Fragch frage mich, aus welchen Gründen diese Ergebnisse erzielt wurde
Diese Antwort erklärtnp.logical_or
und sagtnp.logical_or(np.nan, False)
is beTrue
aber warum funktioniert das nur vektorisiert und nicht in Ansatz 2? Und wie lassen sich die Ergebnisse von Ansatz 1 erklären?