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
如果您创建一个包含 NA 值的列(例如,以便稍后填充),使用 df['new_col'] = pd.NA,则新列的 dtype 将被设置为 object。在此列上的性能将比使用适当的数据类型差。最好使用 df['new_col'] = pd.Series(pd.NA, dtype="boolean")(或另一个支持 NA 的 dtype)。
In [5]: df = pd.DataFrame()
In [6]: df['objects'] = pd.NA
In [7]: df.dtypes
Out[7]:
objects object
dtype: object
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 在输出中视为始终为 false。
在 or 中
In [8]: pd.Series([True, False, np.nan], dtype="object") | True
Out[8]:
0 True
1 True
2 False
dtype: bool
In [9]: pd.Series([True, False, np.nan], dtype="boolean") | True
Out[9]:
0 True
1 True
2 True
dtype: boolean
在 and 中
In [10]: pd.Series([True, False, np.nan], dtype="object") & True
Out[10]:
0 True
1 False
2 False
dtype: bool
In [11]: pd.Series([True, False, np.nan], dtype="boolean") & True
Out[11]:
0 True
1 False
2 <NA>
dtype: boolean