Интуитивно-ориентированное вычисление Панды с булевой операцией [дубликат]

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

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

54
задан user2988577 28 January 2014 в 22:16
поделиться

1 ответ

Когда вы говорите

(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, что и выше. Вот почему круглые скобки являются обязательными.

101
ответ дан unutbu 26 August 2018 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: