Porque nesse caso estamos lidando com uma operação lógica de OU (ou seja, ou).
O operador | é o OU lógico bit a bit, e é o correto para expressões entre séries booleanas (como ao filtrar DataFrames com múltiplas condições).
Já o & representa o E lógico (ou seja, "Nome é Alice e também é Carlos"), o que nunca será verdade — uma mesma linha não pode ter dois nomes ao mesmo tempo.
Dica prática:
No query(), usamos os símbolos:
& para "E"
| para "OU"
Ambos precisam que cada condição esteja entre parênteses fora do query(), mas dentro de query() a sintaxe aceita sem parênteses:
python
Copiar
Editar
df.query('cond1 | cond2') # correto
2. Por que no Desafio Extra não foi necessário acessar a coluna ['Nome'] diretamente?
python
Copiar
Editar
alunos_aprovados = alunos_aprovados['Nome'].replace(7, 8)
Resposta:
Na verdade, esse exemplo está acessando sim a coluna ['Nome'] diretamente!
O que pode estar gerando confusão é o seguinte: talvez você esperasse algo como alunos_aprovados.replace(7, 8), e não alunos_aprovados['Nome'].replace(...).
O código:
python
Copiar
Editar
alunos_aprovados['Nome'].replace(7, 8)
Está acessando apenas a coluna Nome do DataFrame e aplicando .replace() somente nela.
Resumo Final:
Situação Explicação
vs&noquery()
Uso de ['Nome'] No segundo exemplo, ['Nome'] está explicitamente presente. A função replace está sendo aplicada apenas nessa coluna específica.