Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Comparar com Abordagens diferentes de filtro

Eu gosto da abordagem com query, por estar acostumado com desenvolvimento SQL me parece muito limpo, claro e intuitivo, porém, vejo que a forma booleana pode ser mais útil quando precisa aplicar funções :

-filtro mais simples e query que numexpr internamente é mais performático

  • filtros com funcções aplicadas usando apply e outros, a forma booleana parece mais interessante
df_produtos.query(
    "`Categoria do produto` == 'Eletrônicos' and `Preço do produto` >= 350.0"
)

categoria = "Eletrônicos"
preco_minimo = 350

df_produtos.query(
    "`Categoria do produto` == @categoria and `Preço do produto` >= @preco_minimo"
)

df_produtos[
    df_produtos["Categoria do produto"].str.startswith("Ele")
]

df_produtos[
    df_produtos["Preço do produto"].apply(minha_funcao)
]
2 respostas
solução!

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!

Valeu demais os acrescimos Evandro, muito legal a troca de ideias. Um Abraço