Olá, Marcelo. Como vai?
Muito bacana a sua iniciativa de trazer essa reflexão para o fórum! A sua observação é de nível avançado e toca em um ponto crucial do dia a dia de quem trabalha com análise de dados: escolher a ferramenta certa de acordo com o contexto do código e da base de dados.
Você resumiu perfeitamente as forças de cada abordagem. Para agregar ainda mais valor ao seu tópico e aprofundar essa comparação para os colegas que estão estudando o Pandas, podemos destacar alguns detalhes técnicos sobre o funcionamento desses filtros:
- Performance e Memória: Como você bem pontuou, o método
query() utiliza a biblioteca numexpr por baixo dos panos. A grande vantagem disso é que ele não cria matrizes booleanas intermediárias na memória (o que acontece na filtragem condicional tradicional). Isso torna o query() significativamente mais rápido e eficiente no consumo de memória RAM em DataFrames muito grandes (geralmente com mais de 200 mil linhas). Porém, para bases de dados pequenas, a filtragem booleana acaba sendo ligeiramente mais rápida, pois o método query() exige um pequeno tempo extra de processamento do computador para interpretar a string de texto. - Legibilidade (O estilo SQL): O uso do
query() é fantástico para quem já tem familiaridade com SQL. Ele elimina a necessidade de repetir o nome do DataFrame várias vezes e de colocar cada condição entre parênteses, tornando o código muito mais limpo e legível. Além disso, o uso do @ para referenciar variáveis externas do Python dentro da consulta, como você demonstrou, é um recurso extremamente poderoso. - O Poder da Filtragem Booleana: Como você exemplificou com precisão, a filtragem booleana brilha quando precisamos utilizar métodos específicos do Pandas (como propriedades
.str para textos ou .dt para datas) ou aplicar lógicas customizadas com o .apply(). O query() não consegue interpretar a execução dessas funções complexas diretamente dentro da sua string.
Para deixar o seu código registrado de forma bem legível para a comunidade testar e aplicar nos próprios projetos, estruturei os seus exemplos em um bloco de código Python:
# Abordagem com query (direta)
df_produtos.query("`Categoria do produto` == 'Eletrônicos' and `Preço do produto` >= 350.0")
# Abordagem com query usando variáveis externas
categoria = "Eletrônicos"
preco_minimo = 350
df_produtos.query("`Categoria do produto` == @categoria and `Preço do produto` >= @preco_minimo")
# Abordagem booleana com métodos de string
df_produtos[df_produtos["Categoria do produto"].str.startswith("Ele")]
# Abordagem booleana com funções customizadas
df_produtos[df_produtos["Preço do produto"].apply(minha_funcao)]
Continue trazendo essas análises e comparações para o fórum, pois elas enriquecem muito o nível das discussões e o aprendizado de todos os alunos.
Espero que possa ter lhe ajudado!