Если я использую стандартные булевы операторы Python and
/ or
/ not
, одна приятная особенность заключается в том, что они обрабатывают None
так, как я бы логично ожидал. То есть не только
True and True == True
True and False == False
но также
True and None == None
False and None == False
True or None == True
False or None == None
Это соответствует логике, например, если A ложно, а B неизвестно, (A и B) все равно должно быть ложным, а (A или B) неизвестно.
Мне нужно было выполнить логические операции над кадрами данных Pandas с отсутствующими данными, и я надеялся, что смогу использовать ту же логику. Для логической логики на числовых массивах и рядах Панд нам нужно использовать побитовые операторы &
/ |
/ ~
. Панды, кажется, имеют поведение, которое частично совпадает с and
/ or
/ not
, но частично отличается. Короче говоря, кажется, что он возвращает False
, когда значение логически должно быть неизвестно.
Например:
a = pd.Series([True,False,True,False])
b = pd.Series([True,True,None,None])
Тогда мы получим
> a & b
0 True
1 False
2 False
3 False
dtype: bool
и
> a | b
0 True
1 True
2 True
3 False
Я ожидаю, что на выходе a & b
должна быть серия [True,False,None,False]
, а на выходе a | b
должна быть серия [True,True,True,None]
. Фактический результат соответствует ожидаемому, за исключением того, что возвращается False
вместо пропущенных значений.
Наконец, ~b
просто выдает ошибку TypeError:
TypeError: неверный тип операнда для унарного ~: 'NoneType'
, что кажется странным, поскольку &
и |
хотя бы частично работают.
Есть ли лучший способ для выполнения логической логики в этой ситуации? Это ошибка в Пандах?
Аналогичные тесты с массивами-пустышками просто дают ошибки типа, поэтому я предполагаю, что Pandas сам обрабатывает логику