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
>>>