问题描述

1
2
3
4
5
6
7
8
9
>>> data = {'state': ['US','Ohio','Nevada'], 'pop':[2.5, 4.3, 3.2]}
>>> df = pd.DataFrame(data)
>>> df
pop state
0 2.5 US
1 4.3 Ohio
2 3.2 Nevada
>>> df[(df['pop']>3) and (df['pop']<4)]
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

解决问题

原因是由于在python中 orand 的声明需要 truth-values, 即真实的True或者False

但是df['pop']>3返回并不是True或False,而仍然是一个Series,所以在pandas中这样使用被认为是不明确(ambiguous)

因此需要使用位运算符(bitwise)即 |(or) 或者 &(and):

1
2
3
>>> df[(df['pop']>3) & (df['pop']<4)]
pop state
2 3.2 Nevada

附加说明

如果想实现 and 或者 or 的效果,可以使用 logical_orlogical_and 或者 位运算符(bitwise)即 | (or) 和 & (and)

  • logical_or:
1
2
>>> import numpy as np
>>> np.logical_or(x, y)

或者 | 运算符

1
>>> x | y
  • logical_and:
1
2
>>> import numpy as np
>>> np.logical_and(x, y)

或者 & 运算符

1
>>> x & y

当使用位运算符时,因为运算符优先级的问题,请将两边用括号包起来。查看详情

除此之外还有 一些其他逻辑操作 logical_notlogical_xor查看详情


注意

当使用bool来操作pandas.Series时会返回一个异常:

1
2
3
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

下列操作也会抛出异常:

1
2
3
4
5
6
7
8
9
10
>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这些隐式调用其实也是将之转为bool类型,因此仍会错误,除了上述4个声明外,还有一些操作会产生同样的效果(类似any, all, filter, …)