Для операторов or
и and
python требуются truth
-values. Потому что pandas
они считаются неоднозначными, поэтому вы должны использовать «побитовые» |
(или) или &
(и) операции:
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Они перегружены для такого рода структур данных, чтобы получить поэлементное or
(или and
).
Просто чтобы добавить еще одно объяснение к этому утверждению:
Исключение , когда вы хотите получить bool
из pandas.Series
:
>>> import pandas as pd
>>> 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().
То, что вы ударили, было местом, где оператор неявно конвертировал операнды в bool
(вы использовали, or
но это также бывает для and
, if
и while
):
>>> 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().
Кроме того , эти 4 заявлений есть несколько функций Python , которые скрывают некоторые bool
вызовы (например any
, all
, filter
, ...) это обычно не вызывают проблемы с , pandas.Series
но для полноты картины я хотел упомянуть это.
В вашем случае исключение не очень полезно, потому что оно не упоминает правильные альтернативы . Для and
и or
вы можете использовать (если вы хотите поэлементное сравнение):
Если вы используете операторы, убедитесь, что вы правильно установили круглые скобки из-за приоритета оператора .
Есть несколько логических функций, которые должны работать pandas.Series
.
Альтернативы, упомянутые в Исключении, больше подходят, если вы столкнулись с этим при выполнении if
или while
. Я кратко объясню каждый из них:
Если вы хотите проверить, пуста ли ваша серия :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python обычно интерпретирует len
GTH контейнеров (например list
, tuple
...) , как истинностное значение , если оно не имеет явное логическое толкования. Поэтому, если вы хотите проверку, подобную питону, вы можете сделать: if x.size
или if not x.empty
вместо if x
.
Если ваш Series
содержит одно и только одно логическое значение:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Если вы хотите проверить первый и единственный элемент вашей Серии (например, .bool()
но работает даже для не булева содержимого):
>>> x = pd.Series([100])
>>> x.item()
100
Если вы хотите проверить, что все или любой элемент не нулевой, не пустой или не ложный:
>>> x = pd.Series([0, 1, 2])
>>> x.all() # because one element is zero
False
>>> x.any() # because one (or more) elements are non-zero
True
|
вместоor