Возникла проблема с фильтрацией моего результирующего кадра данных с or
условием. Я хочу, чтобы мой результат df
извлекал все var
значения столбцов , которые выше 0,25 и ниже -0,25.
Эта логика ниже дает мне неоднозначное значение истины, однако оно работает, когда я разделяю эту фильтрацию на две отдельные операции. Что здесь происходит? не уверен, где использовать предложенное a.empty(), a.bool(), a.item(),a.any() or a.all()
.
result = result[(result['var']>0.25) or (result['var']<-0.25)]
|
вместоor
abs(result['var'])>0.25
Ответы:
Для операторов
or
иand
python требуютсяtruth
-values. Потому чтоpandas
они считаются неоднозначными, поэтому вы должны использовать «побитовые»|
(или) или&
(и) операции:Они перегружены для такого рода структур данных, чтобы получить поэлементное
or
(илиand
).Просто чтобы добавить еще одно объяснение к этому утверждению:
Исключение , когда вы хотите получить
bool
изpandas.Series
:То, что вы ударили, было местом, где оператор неявно конвертировал операнды в
bool
(вы использовали,or
но это также бывает дляand
,if
иwhile
):Кроме того , эти 4 заявлений есть несколько функций Python , которые скрывают некоторые
bool
вызовы (напримерany
,all
,filter
, ...) это обычно не вызывают проблемы с ,pandas.Series
но для полноты картины я хотел упомянуть это.В вашем случае исключение не очень полезно, потому что оно не упоминает правильные альтернативы . Для
and
иor
вы можете использовать (если вы хотите поэлементное сравнение):numpy.logical_or
:или просто
|
оператор:numpy.logical_and
:или просто
&
оператор:Если вы используете операторы, убедитесь, что вы правильно установили круглые скобки из-за приоритета оператора .
Есть несколько логических функций, которые должны работать
pandas.Series
.Альтернативы, упомянутые в Исключении, больше подходят, если вы столкнулись с этим при выполнении
if
илиwhile
. Я кратко объясню каждый из них:Если вы хотите проверить, пуста ли ваша серия :
Python обычно интерпретирует
len
GTH контейнеров (напримерlist
,tuple
...) , как истинностное значение , если оно не имеет явное логическое толкования. Поэтому, если вы хотите проверку, подобную питону, вы можете сделать:if x.size
илиif not x.empty
вместоif x
.Если ваш
Series
содержит одно и только одно логическое значение:Если вы хотите проверить первый и единственный элемент вашей Серии (например,
.bool()
но работает даже для не булева содержимого):Если вы хотите проверить, что все или любой элемент не нулевой, не пустой или не ложный:
источник
and
,or
иnot
в Python. Эти операторы напрямую используют то,bool
что возвращается из операндов. И в некотором роде Pandas / NumPy перегружены, что уже поднять,ValueError
потому что они считают истинную ценность такой структуры данных неоднозначной.Для логической логики используйте
&
и|
.Чтобы увидеть, что происходит, вы получаете столбец логических значений для каждого сравнения, например
Если у вас есть несколько критериев, вы получите несколько возвращенных столбцов. Вот почему логика соединения неоднозначна. Использование
and
или обработкаor
каждого столбца в отдельности, поэтому сначала необходимо уменьшить этот столбец до одного логического значения. Например, чтобы увидеть, является ли какое-либо значение или все значения в каждом из столбцов истинными.Один из запутанных способов достижения одной и той же цели - сжать все эти столбцы и выполнить соответствующую логику.
Для получения более подробной информации см. Булево индексирование в документации.
источник
Ну, панды используют побитовые '&' '|' и каждое условие должно быть заключено в '()'
Например следующие работы
Но тот же запрос без правильных скобок не
источник
Или, в качестве альтернативы, вы можете использовать модуль оператора. Более подробная информация здесь Python документы
источник
Этот превосходный ответ очень хорошо объясняет происходящее и дает решение. Я хотел бы добавить другое решение, которое может подойти в подобных случаях: используя
query
метод:Смотрите также http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-query .
(Некоторые тесты с фреймом данных, с которым я сейчас работаю, предполагают, что этот метод немного медленнее, чем использование побитовых операторов в логических сериях: 2 мс против 870 мкс)
Предупреждение : по крайней мере одна ситуация, когда это не так просто, - когда имена столбцов оказываются выражениями python. Мне назвали столбцы
WT_38hph_IP_2
,WT_38hph_input_2
и яlog2(WT_38hph_IP_2/WT_38hph_input_2)
хотел выполнить следующий запрос:"(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"
Я получил следующий каскад исключений:
KeyError: 'log2'
UndefinedVariableError: name 'log2' is not defined
ValueError: "log2" is not a supported function
Я предполагаю, что это произошло потому, что анализатор запросов пытался создать что-то из первых двух столбцов вместо того, чтобы отождествлять выражение с именем третьего столбца.
Возможный обходной путь предлагается здесь .
источник
Я столкнулся с той же ошибкой и несколько дней зависал с фреймом данных pyspark, и мне удалось успешно ее исправить, заполнив n значениями 0, так как я сравнивал целочисленные значения из 2 полей.
источник