index iloc example columns python pandas boolean-logic

python - iloc - Operador lógico para la indexación booleana en pandas



select rows dataframe pandas (1)

Cuando tu dices

(a[''x'']==1) and (a[''y'']==10)

Está implícitamente pidiendo a Python que convierta (a[''x'']==1) y (a[''y'']==10) en valores booleanos.

Los arreglos NumPy (de longitud superior a 1) y los objetos Pandas, como Series, no tienen un valor booleano; en otras palabras, aumentan

ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().

cuando se usa como un valor booleano. Eso es porque no está claro cuándo debería ser verdadero o falso . Algunos usuarios pueden suponer que son verdaderos si tienen una longitud distinta de cero, como una lista de Python. Otros pueden desear que sea Verdadero solo si todos sus elementos son Verdaderos. Otros pueden querer que sea verdadero si alguno de sus elementos es verdadero.

Debido a que hay tantas expectativas contradictorias, los diseñadores de NumPy y Pandas se niegan a adivinar, y en su lugar plantean un ValueError.

En su lugar, debe ser explícito, llamando al método empty() , all() o any() para indicar qué comportamiento desea.

En este caso, sin embargo, parece que no desea una evaluación booleana, desea elementos lógicos y elementos. Eso es lo que el operador & binary realiza:

(a[''x'']==1) & (a[''y'']==10)

devuelve una matriz booleana.

Por cierto, como señala alexpmil , los paréntesis son obligatorios ya que & tiene una precedencia de operador mayor que == . Sin los paréntesis, a[''x'']==1 & a[''y'']==10 se evaluaría como a[''x''] == (1 & a[''y'']) == 10 que a su vez, será equivalente a la comparación encadenada (a[''x''] == (1 & a[''y''])) and ((1 & a[''y'']) == 10) . Esa es una expresión de la forma Series and Series . El uso de and con dos Series volvería a activar el mismo ValueError que el anterior. Es por eso que los paréntesis son obligatorios.

Estoy trabajando con el índice booleano en Pandas. La pregunta es por qué la declaración:

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

funciona bien mientras

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

existe con error?

Ejemplo:

a=pd.DataFrame({''x'':[1,1],''y'':[10,20]}) In: a[(a[''x'']==1)&(a[''y'']==10)] Out: x y 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()