Nullable Boolean データ型#

注意

BooleanArray は現在実験段階です。その API または実装は予告なく変更される可能性があります。

NA 値によるインデックス#

pandas では、ブール配列内の NA 値を使ったインデックスが可能です。この場合、False として扱われます。

In [1]: s = pd.Series([1, 2, 3])

In [2]: mask = pd.array([True, False, pd.NA], dtype="boolean")

In [3]: s[mask]
Out[3]: 
0    1
dtype: int64

NA 値を保持したい場合は、fillna(True) で手動で埋めることができます。

In [4]: s[mask.fillna(True)]
Out[4]: 
0    1
2    3
dtype: int64

クリーン論理演算#

arrays.BooleanArray は、クリーン論理(三値論理とも呼ばれます)を、& (and)、| (or)、^ (exclusive-or) のような論理演算に実装しています。

この表は、すべての組み合わせの結果を示しています。これらの演算は対称なので、左辺と右辺を反転させても結果は変わりません。

結果

True & True

True

True & False

False

True & NA

NA

False & False

False

False & NA

False

NA & NA

NA

True | True

True

True | False

True

True | NA

True

False | False

False

False | NA

NA

NA | NA

NA

True ^ True

False

True ^ False

True

True ^ NA

NA

False ^ False

False

False ^ NA

NA

NA ^ NA

NA

演算に NA が存在する場合、出力値が NA になるのは、他の入力のみに基づいて結果を決定できない場合のみです。たとえば、True | NATrue になります。なぜなら、True | TrueTrue | False の両方が True だからです。この場合、NA の値を考慮する必要はありません。

一方、True & NANA です。結果は、NA が本当に True なのか False なのかに依存します。なぜなら、True & TrueTrue ですが、True & FalseFalse なので、出力を決定できないからです。

これは、np.nan が論理演算でどのように振る舞うかとは異なります。pandas は np.nan出力では常に false として扱っていました。

or の場合

In [5]: pd.Series([True, False, np.nan], dtype="object") | True
Out[5]: 
0     True
1     True
2    False
dtype: bool

In [6]: pd.Series([True, False, np.nan], dtype="boolean") | True
Out[6]: 
0    True
1    True
2    True
dtype: boolean

and の場合

In [7]: pd.Series([True, False, np.nan], dtype="object") & True
Out[7]: 
0     True
1    False
2    False
dtype: bool

In [8]: pd.Series([True, False, np.nan], dtype="boolean") & True
Out[8]: 
0     True
1    False
2     <NA>
dtype: boolean