Когда вы говорите
(a['x']==1) and (a['y']==10)
Вы неявно просите Python преобразовать (a['x']==1)
и (a['y']==10)
в логические значения.
Массивы NumPy (длиной более 1) и объекты Pandas, такие как Series, не имеют логического значения, другими словами, они повышают
ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().
при использовании в качестве boolean value. Это потому, что его непонятно, когда оно должно быть True или False . Некоторые пользователи могут предположить, что они True, если они имеют ненулевую длину, например, список Python. Другие могут пожелать, чтобы это было Истиной только в том случае, если все ее элементы были Истины. Другие могут хотеть, чтобы она была Истиной, если какой-либо из ее элементов True.
Поскольку существует так много противоречивых ожиданий, дизайнеры NumPy и Pandas отказываются угадывать, а вместо этого повышают значение ValueError.
Вместо этого вы должны быть явными, вызвав empty()
, all()
или any()
, чтобы указать, какое поведение вы желаете.
В этом случае, однако, похоже, что вам не нужна логическая оценка, вы хотите логически логически и логически. Это то, что выполняет бинарный оператор &
:
(a['x']==1) & (a['y']==10)
возвращает логический массив.
Кстати, как отмечает alexpmil , скобки являются обязательными, поскольку &
имеет более высокий приоритет оператора , чем ==
. Без круглых скобок a['x']==1 & a['y']==10
будет оцениваться как a['x'] == (1 & a['y']) == 10
, который, в свою очередь, будет эквивалентен сопоставленному сравнению (a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)
. Это выражение формы Series and Series
. Использование and
с двумя сериями снова приведет к тому же ValueError
, что и выше. Вот почему круглые скобки являются обязательными.