使用NumPy进行数据验证时出现TypeError: unsupported operand type(s) for &: 'tuple' and 'tuple'错误的解决咨询
问题分析与解决方法
嘿,我来帮你搞定这个报错问题~
错误原因
你触发的TypeError: unsupported operand type(s) for &: 'tuple' and 'tuple',核心问题出在**np.where()的返回值类型上:
当你只给np.where()传入一个布尔条件时,它返回的是满足条件的元素的索引元组**(格式是(行索引数组, 列索引数组)),而不是你需要的布尔掩码数组。这时候你用&去连接两个元组,Python根本不知道怎么处理这种操作,自然就报错了。
而且np.select()要求conditions参数是一组布尔数组(每个元素是True/False的数组),用来标记哪些位置要对应values里的值,你传索引元组肯定不符合要求啦。
解决方法
其实完全没必要用np.where(),直接用Pandas自带的布尔比较表达式就能生成符合要求的布尔数组,修正后的代码如下:
conditions = [ df['DD'].eq('No DD Required'), (df['DD'].eq('DD Required')) & (df['On Direct Debit'].eq('No')), (df['DD'].eq('DD Required')) & (df['On Direct Debit'].eq('Yes')) ] values = ['Pass', 'Fail', 'Pass'] df['DDValidation'] = np.select(conditions, values)
这里要注意给每个复合条件加括号,因为&的运算符优先级比eq()高,不加括号会导致逻辑判断出错。
如果实在想用np.where()的话,你需要取出元组里的索引数组部分(不过完全没必要多此一举),写法是np.where(condition)[0],但显然上面的直接用Pandas布尔表达式的写法更简洁高效。
内容的提问来源于stack exchange,提问作者Jkendrick
相关产品推荐
相关产品推荐

