Обнуляемый логический тип данных#

Примечание

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 реализует Логика Клини (иногда называемая трёхзначной логикой) для логических операций, таких как & (и), | (или) и ^ (исключающее ИЛИ).

Эта таблица демонстрирует результаты для каждой комбинации. Эти операции симметричны, поэтому перестановка левой и правой сторон не влияет на результат.

Выражение

Результат

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 | 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     
dtype: boolean