Python 如何对缺失值执行布尔代数?

Python 如何对缺失值执行布尔代数?,python,boolean-expression,Python,Boolean Expression,我想复制布尔NA值,因为它们在R中的行为: NA是一个有效的逻辑对象。如果x或y的分量为NA,则如果结果不明确,则结果将为NA。换句话说,NA&TRUE的计算结果为NA,而NA&FALSE的计算结果为FALSE。 我看到有人建议使用None来计算缺少的值,但是Python在计算布尔表达式时将None转换为False,并将None或False计算为False。结果当然应该是None,因为如果缺少值,就无法得出任何结论 如何在Python中实现这一点 EDIT接受的答案使用位布尔运算符正确计算,但

我想复制布尔
NA
值,因为它们在R中的行为:

NA是一个有效的逻辑对象。如果x或y的分量为NA,则如果结果不明确,则结果将为NA。换句话说,NA&TRUE的计算结果为NA,而NA&FALSE的计算结果为FALSE。

我看到有人建议使用
None
来计算缺少的值,但是Python在计算布尔表达式时将
None
转换为
False
,并将
None或False
计算为
False
。结果当然应该是
None
,因为如果缺少值,就无法得出任何结论

如何在Python中实现这一点


EDIT接受的答案使用位布尔运算符正确计算,但要使用逻辑运算符
而不是
实现相同的行为,似乎需要更改Python编程语言。

您可以定义自定义类(单例?)并定义自定义的
\uuuu和uuu
(以及您需要的任何其他)函数。见此:


您可以通过创建一个类并重写布尔运算方法来实现这一点

>>> class NA_type(object):
        def __and__(self,other):
                if other == True:
                        return self
                else:
                        return False
        def __str__(self):
                return 'NA'


>>> 
>>> NA = NA_type()
>>> print NA & True
NA
>>> print NA & False
False

正如其他人所说,您可以定义自己的类

class NA_(object):
    instance = None # Singleton (so `val is NA` will work)
    def __new__(self):
        if NA_.instance is None:
            NA_.instance = super(NA_, self).__new__(self)
        return NA_.instance
    def __str__(self): return "NA"
    def __repr__(self): return "NA_()"
    def __and__(self, other):
        if self is other or other:
            return self
        else:
            return other
    __rand__ = __and__
    def __or__(self, other):
        if self is other or other:
            return other
        else:
            return self
    __ror__ = __or__
    def __xor__(self, other):
        return self
    __rxor__ = __xor__
    def __eq__(self, other):
        return self is other
    __req__ = __eq__
    def __nonzero__(self):
        raise TypeError("bool(NA) is undefined.")
NA = NA_()
使用:

>>打印NA&NA
NA
>>>打印NA&True
NA
>>>打印NA和False
假的
>>>打印不正确
真的
>>>打印NA |假
NA
>>>打印NA | NA
NA
>>>打印不正确
NA
>>>打印NA^NA
NA
>>>如果不适用:打印3
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第28行,输入非零__
类型错误:布尔(NA)未定义。
>>>如果不适用(&False):打印3
...
>>>
>>>如果不正确:打印3
...
3.
>>>

NA&NA
给出
False
。可能不是想要的行为。另外,如果NA:do_whatever()
在没有任何警告的情况下执行
do_whatever()
,那么对
这一事实采取一些措施可能是有益的。@Chris Barker是的,您的答案要完整得多。我只是给出了一个起点。
(lambda x:x | ~x)(NA)
?我喜欢你的答案,但你仍然无法评估
NA或True
True
?您的示例使用位运算符。据我所知,不可能覆盖“or”和“and”
NA或True
被解释为
(NA.\u非零\u非零()==True);(True.\u非零\u非零()==True)
。如果我错了,请纠正我;我很想在这件事上犯错。
>>> print NA & NA
NA
>>> print NA & True
NA
>>> print NA & False
False
>>> print NA | True
True
>>> print NA | False
NA
>>> print NA | NA
NA
>>> print NA ^ True
NA
>>> print NA ^ NA
NA
>>> if NA: print 3
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 28, in __nonzero__
TypeError: bool(NA) is undefined.
>>> if NA & False: print 3
...
>>>
>>> if NA | True: print 3
...
3
>>>