Логический оператор для булевой индексации в Pandas

Я работаю с булевым индексом в Pandas. Вопрос в том, почему утверждение:

a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)] 

работает отлично, тогда как

 a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)] 

существует с ошибкой?

Пример:

 a=pd.DataFrame({'x':[1,1],'y':[10,20]}) In: a[(a['x']==1)&(a['y']==10)] Out: xy 0 1 10 In: a[(a['x']==1) and (a['y']==10)] Out: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

One Solution collect form web for “Логический оператор для булевой индексации в Pandas”

Когда ты говоришь

 (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(). 

при использовании в качестве логического значения. Это потому, что его неясно, когда оно должно быть истинным или ложным . Некоторые пользователи могут предположить, что они True, если они имеют ненулевую длину, например, список Python. Другие могут пожелать, чтобы это было Истиной только в том случае, если все ее элементы были Истины. Другие могут хотеть, чтобы она была Истиной, если какой-либо из ее элементов True.

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

Вместо этого вы должны быть явным, вызывая метод empty() , all() или any() чтобы указать, какое поведение вы желаете.

В этом случае, однако, похоже, что вам не нужна логическая оценка, вы хотите логически логически логически и логически. Это & выполняет оператор & binary:

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

  • Определение интервалов уверенности и прогнозирования с повторными вводами
  • Утечка памяти с использованием кадра данных pandas
  • Изменение временной частоты в Pandas Dataframe
  • Преобразование ORM SQLAlchemy в pandas DataFrame
  • Переупорядочение базы данных pandas на основе нескольких столбцов и суммы одного столбца
  • Сохранение порядка столбцов - Python Pandas и Column Concat
  • Как сделать объединение мультииндекса данных с единым индексом данных?
  • Коробка Python из столбцов разной длины
  • Python - лучший язык программирования в мире.