Pandas逻辑运算: The truth value of a Series is ambiguous
问题描述
1 | > data = {'state': ['US','Ohio','Nevada'], 'pop':[2.5, 4.3, 3.2]} |
解决问题
原因是由于在python中 or 和 and 的声明需要 truth-values, 即真实的True或者False
但是df['pop']>3返回并不是True或False,而仍然是一个Series,所以在pandas中这样使用被认为是不明确(ambiguous)
因此需要使用位运算符(bitwise)即 |(or) 或者 &(and):
1 | >>> df[(df['pop']>3) & (df['pop']<4)] |
附加说明
如果想实现 and 或者 or 的效果,可以使用 logical_or 和 logical_and 或者 位运算符(bitwise)即 | (or) 和 & (and)
- logical_or:
1 | > import numpy as np |
或者 | 运算符
1 | >>> x | y |
- logical_and:
1 | > import numpy as np |
或者 & 运算符
1 | > x & y |
当使用位运算符时,因为运算符优先级的问题,请将两边用括号包起来。查看详情
除此之外还有 一些其他逻辑操作 logical_not 和 logical_xor… 查看详情
注意
当使用bool来操作pandas.Series时会返回一个异常:
1 | >>> x = pd.Series([1]) |
下列操作也会抛出异常:
1 | >>> x or x |
这些隐式调用其实也是将之转为bool类型,因此仍会错误,除了上述4个声明外,还有一些操作会产生同样的效果(类似any, all, filter, …)