使用np.where写多条件语句:为何第一种写法有效第二种报错
问题原因分析
你遇到的报错核心是Python运算符优先级规则导致的计算逻辑异常,具体拆解如下:
- 位运算符
&的优先级远高于==、!=、>=这类比较运算符,第二种写法没有给单个判断条件包裹括号,执行时的计算顺序会变成:data_frame['A'] == (1 & data_frame['B']) != 0 - 优先执行
1 & data_frame['B']这一步时,会尝试拿整数标量1和float64类型的B列数组做按位与运算,类型不匹配直接触发你看到的TypeError,报错信息里的rand_就是Python对象按位与运算的内置魔法方法。 - 第一种写法直接调用
np.logical_and、np.greater_equal、np.not_equal这类Numpy内置的逻辑判断函数,不存在运算符优先级的歧义,计算顺序完全符合预期,因此可以正常运行。
修正方案
如果想要使用运算符简写多条件判断,只需要给每一个独立的比较条件都用圆括号包裹即可正常运行,修正后的代码如下:
data_frame['C'] = np.where((data_frame['A'] == 1) & (data_frame['B'] != 0), 'OK', '-')
额外注意:Pandas/Numpy的数组批量条件判断不能使用Python原生的
and/or/not逻辑运算符,必须使用对应的位运算符&(逻辑与)、|(逻辑或)、~(逻辑非),且所有位运算符两侧的条件必须加括号。
内容的提问来源于stack exchange,提问作者haraujo
相关产品推荐
相关产品推荐

