Почему я получаю ValueError: Истинное значение Серии неоднозначно? - PullRequest
0 голосов
/ 15 апреля 2020

Я знаю, что подобный вопрос задавался ранее, но я изо всех сил пытаюсь понять, почему я получаю эту ошибку.

Я использую приведенный ниже код для создания нового столбца с пометкой строки как выброса, если «цена» попадает в верхний предел, «цена_h2» и нижний предел, «цена_h1»

df_test['price_outlier'] = np.where( df_test['price_h1'] <= df_test['price'] <= df_test['price_h2'],'normal','outlier')

Помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Поскольку массивы numpy не поддерживают синтаксис: a

Вам необходимо использовать скобки для разделения обоих предложений (a :

df_test['price_outlier'] = np.where((df_test['price_h1'] <= df_test['price']) &\
                                    (df_test['price'] <= df_test['price_h2']), 
                                    'normal', 'outlier')
1 голос
/ 15 апреля 2020

Причина этого в том, что pandas решает выдать ошибку, если вы пытаетесь транслировать операции на многоэлементных логических сериях, поскольку это по своей сути неоднозначно относительно того, каким должно быть поведение.

pandas следует соглашению NumPy об ошибке, когда вы пытаетесь преобразовать что-то в bool. Это происходит в операторе if или при использовании логических операций: и, или, и нет. Неясно, каким должен быть результат следующего кода:

См. документацию pandas для получения дополнительной информации об этом поведении.

Что касается как вы можете заставить желаемое поведение работать; имейте в виду, что вы можете назначить столбец для фрейма данных, используя множество различных типов данных (списки, dicts, ndarrays и т. д. c.). Таким образом, простой способ обойти проблемы сравнения рядов - это использовать понимание списка.

df_test['price_outlier'] = [a <= b <= c for a, b, c in zip(df_test['price_h1'], df_test['price'], df_test['price_h2'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...