为什么Pandas中`not`操作布尔Series无效但`!= True`可用?
pandas两种过滤条件的底层差异说明
pandas.isna(data["Primary Fur Color"]) 执行后会返回一个和 Primary Fur Color 列等长的布尔Series,每个元素对应原列对应行的值是否为缺失值,两种写法的差异本质是Python关键字运算和pandas重载运算符的逻辑不同:
- 写法1:
not pandas.isna(data["Primary Fur Color"])
Python内置的not是作用于单个布尔值的关键字,执行时会先尝试将整个Series对象转换为单个布尔值(即调用bool(Series))。但pandas明确禁止对长度大于1的Series做直接布尔转换,因为无法判断你需要的是「所有元素为真」「存在元素为真」还是其他判断逻辑,这就是报错中提到的「Series的真值存在歧义」的来源,因此直接抛出ValueError。 - 写法2:
pandas.isna(data["Primary Fur Color"]) != True
pandas对!=等比较运算符做了重载,执行时会做逐元素运算:遍历Series的每一个元素,分别和True做不等比较,最终返回的仍然是一个等长的布尔Series。这种逐元素运算得到的布尔Series是pandas布尔索引的标准输入格式,因此可以正常用于过滤数据。
补充说明:实际开发中更推荐用逐元素取反运算符~来实现同样的逻辑,写法更简洁:~pandas.isna(data["Primary Fur Color"]),效果和第二种写法完全一致。
内容的提问来源于stack exchange,提问作者Arvind Kumar Avinash
相关产品推荐
相关产品推荐

