Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Usar 'and/or' ou '&/|'

A resposta correta do exercício é

selecao = (alunos.Aprovado == True) & (alunos.Sexo == 'F')
aprovadas = alunos[selecao]
aprovadas

Porém, por que a alternativa A não funciona?

selecao = (alunos.Sexo == 'F') and (alunos.Aprovado == True)
aprovadas = alunos[selecao]
aprovadas

A alternativa A resulta em:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_19952/1708169799.py in <module>
----> 1 select = (alunos.Sexo == 'F') and (alunos.Aprovado == True)

~\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1535     @final
   1536     def __nonzero__(self):
-> 1537         raise ValueError(
   1538             f"The truth value of a {type(self).__name__} is ambiguous. "
   1539             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Sei que os operadores &/| são bit a bit e and/or são os operadores lógicos. Para dataframes, é bem mais eficiente/rápido utilizar &/|. Mas por que and/or resulta em erro de compilação? Penso que deveria funcionar da mesma forma (porém mais lento).

1 resposta
solução!

Oii Laura, tudo certinho?

Realmente nesse tipo de seleção o pandas não interpreta o "and" como um operador lógico. Esse tipo de seleção é chamado de indexação booleana, e os operadores que devemos utilizar para realizá-la são | para or e & para and, como podemos conferir nessa parte da documentação.

No entanto, existe um método na biblioteca pandas chamado query, que é utilizado para realizar seleções em DataFrames, no qual é permitido tanto o uso do & e | quanto do and e or, observe:

import pandas as pd

# realizando a query com o operador and
alunos.query('Aprovado == True and Sexo == "F"')
import pandas as pd

# realizando a query com o operador &
alunos.query('Aprovado == True & Sexo == "F"')

Espero que isso ajude. Qualquer dúvida estou à disposição :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!