可空布尔数据类型#
注意
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
Kleene 逻辑运算#
arrays.BooleanArray
实现 Kleene 逻辑(有时称为三值逻辑)用于逻辑运算,例如 &
(与)、|
(或)和 ^
(异或)。
此表演示了每种组合的结果。这些运算是对称的,因此交换左右两侧不会影响结果。
表达式 |
结果 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当运算中存在 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
始终视为输出中的假值。
在 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