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) のような論理演算に実装しています。
この表は、すべての組み合わせの結果を示しています。これらの演算は対称なので、左辺と右辺を反転させても結果は変わりません。
式 |
結果 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
演算に NA
が存在する場合、出力値が NA
になるのは、他の入力のみに基づいて結果を決定できない場合のみです。たとえば、True | NA
は True
になります。なぜなら、True | True
と True | False
の両方が True
だからです。この場合、NA
の値を考慮する必要はありません。
一方、True & NA
は NA
です。結果は、NA
が本当に True
なのか False
なのかに依存します。なぜなら、True & True
は True
ですが、True & False
は False
なので、出力を決定できないからです。
これは、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