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