ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

Total
0
Shares

Python throws ValueError: The truth value of a series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() when you try to get the bool of Pandas.Series. This issue occurs when you try to use OR, AND, IF, WHILE over two series. These operators require truth values in order to decide the outcome.

True OR True = True, but [1] OR [] = ?

Series comparison is not defined in Pandas.Series. The solution is to use bitwise operators (|, &) which will do element wise comparison.

Code Example

Suppose you have a series and you want the bool type of it, the code for it will be –

>>> import pandas as pd
>>> series_x = pd.Series([1])
>>> bool(series_x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

You see, it raised the valueerror: truth value of series in ambiguous. Pandas do not support this. Similarly, for other operators like OR, AND, IF, WHILE it will raise error.

>>> series_x or series_x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

>>> series_x and series_x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

>>> if series_x:
...     print('Series not empty')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

>>> while series_x:
...     print('Series looped')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Solution

The solution to this error is to use bitwise and/or (|, &) to compare element wise in series. Also, you can use functions provided by numpy like np.logical_or and np.logical_and. Check this code –

>>> import pandas as pd
>>> import numpy as np
>>> series_x = pd.Series([1, 2, 3, 4])
>>> series_y = pd.Series([5, 6, 7, 8])

>>> print(np.logical_or(series_x, series_y))
OUTPUT:
0    True
1    True
2    True
3    True
dtype: bool

>>> print(series_x | series_y)
OUTPUT:
0     5
1     6
2     7
3    12
dtype: int64

>>> print(np.logical_and(series_x, series_y))
OUTPUT:
0    True
1    True
2    True
3    True
dtype: bool

>>> print(series_x & series_y)
OUTPUT:
0    1
1    2
2    3
3    0
dtype: int64

The error message includes few functions like a.empty, a.bool(), a.item() etc. which could be helpful in loops and conditions. For example, if you just want to check if series contains more than zero elements, then you can use .empty.

>>> series_x = pd.Series([])
>>> print(series_x.empty)
True

>>> series_y = pd.Series([1])
>>> print(series_y.empty)
False

For if conditions and loops, you can either use .emtpy or you can get the size of series using .size and decide if its empty. The .all() function will return a bool value depending on the items of series. It acts as AND between the items. So, if any item is 0 or False, then the output by .all() will be False. On the other hand, .any() works as OR, so if at least one item is True, it will return True.

>>> series_x = pd.Series([1, 2, 3, 4, 5])
>>> series_y = pd.Series([0, 1, 2, 3])
>>> series_z = pd.Series([0, 0, 0])

>>> print(series_x.all())
Output: True

>>> print(series_y.all())
Output: False

>>> print(series_z.all())
Output: False

>>> print(series_x.any())
Output: True

>>> print(series_y.any())
Output: True

>>> print(series_z.any())
Output: False

.bool() is used when there is only one element in the series and in boolean type. .item() return the only element of single item series.

>>> series_x = pd.Series([0])
>>> series_y = pd.Series([1])
>>> series_z = pd.Series([True])
>>> series_u = pd.Series([False])
>>> series_v = pd.Series([50])
>>> series_w = pd.Series([50, 60])

>>> print(series_x.bool())
Output: Error! Works with boolean values only

>>> print(series_z.bool())
True

>>> print(series_u.bool())
False

>>> print(series_x.item())
0

>>> print(series_w.item())
Output: Error! Works with single value series only

>>> print(series_z.item())
True

    Tweet this to help others

Live Demo

Open Live Demo