
You might see such an error when you tried to do logical operation.
Why does such kind of error happen ?
How can we solve it ?
So today I will introduce about "The reason of 'ValueError: The truth value of ... is ambiguous' in NumPy or Pandas".
Author

Advantage to read
You can understand about the reason of 'ValueError: The truth value of ... is ambiguous' in NumPy or Pandas. Then you don't have to concern about programming with pandas.DataFrame or NumPy.ndarray.
The reason of "ValueError: The truth value of ... is ambiguous" in NumPy or Pandas
The reason of "ValueError: The truth value of ... is ambiguous" in NumPy or Pandas.
It is because you used and
, or
, not
with NumPy or Pandas.
They are not for element-wise logical operation, but for object-wise logical operation.
Let's see sample code.
First, prepare data that contains boolean column.
DATA
import pandas as pd data_list1 = [ ["a",True,True], ["b",True,False], ["c",False,True], ["d",False,False] ] col_list1 = ["col1","col2","col3"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # col1 col2 col3 # 0 a True True # 1 b True False # 2 c False True # 3 d False False
Then do logical operation by and
, or
, not
.
You can see the error like below.
SAMPLE
df1["not_col2"] = not df1["col2"] print(df1) # ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). df1["and_col2_3"] = (df1["col2"] and df1["col3"]) print(df1) # ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). df1["or_col2_3"] = (df1["col2"] or df1["col3"]) print(df1) # ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
All of them occur ValueError: The truth value of ... is ambiguous
.
How can we do element-wise logical operetion ?
Solution for "ValueError: The truth value of ... is ambiguous"
Object-wise operator and
, or
, not
cause the error.
So what should we do for element-wise logical operetion ?
The solution is that using &
, |
, ~
.
For example, use &
instead of and
.
Then you can get the result below.
SAMPLE
df1["and_col2_3"] = (df1["col2"] & df1["col3"]) print(df1) # col1 col2 col3 and_col2_3 # 0 a True True True # 1 b True False False # 2 c False True False # 3 d False False False
Same as &
, you can use |
instead of or
.
SAMPLE
df1["or_col2_3"] = (df1["col2"] | df1["col3"]) print(df1) # col1 col2 col3 or_col2_3 # 0 a True True True # 1 b True False True # 2 c False True True # 3 d False False False
Also you can use ~
instead of not
.
SAMPLE
df1["not_col2"] = ~df1["col2"] print(df1) # col1 col2 not_col2 # 0 a True False # 1 b True False # 2 c False True # 3 d True False
With using &
, |
, ~
, we can do element-wise logical operetion.
Conclusion
Today I will explained about "The reason of 'ValueError: The truth value of ... is ambiguous' in NumPy or Pandas".
Points are below.
Point
and
,or
,not
are for object-wise logical operation. So when you use them with Pandas or Numpy, they cause error.- Instead of
and
,or
,not
, you can use&
,|
,~
for element-wise logical operation.

There are some other articles about pandas.Dataframe or NumPy.ndarray.
If you interested in them, please read them.
Read more