Blog

Postado em em 29 de abril de 2024

Dominando o Método Query do Pandas

Conheça o método query do Pandas, veja como ele funciona e qual é a sua sintaxe em relação à notação do Pandas.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Dominando o Método Query do Pandas

Na aula de hoje eu vou te mostrar diversos exemplos usando a notação do Pandas (notação com colchetes) e a notação de query para que você possa visualizar como fica mais fácil e mais legível utilizando esse método.

Com as duas formas você conseguirá obter o mesmo resultado, então é mais uma questão de visualização, pois o método query torna a leitura mais fácil.

E aí, bora aprender como filtrar DataFrames usando o query? Então vem comigo que eu vou te ensinar!

Apresentação da Base de Dados

A base de dados que utilizaremos é relativamente simples e foi retirada do site Kaggle. Ela é composta por dados de diversos cereais disponíveis no mercado dos Estados Unidos no início da década de 90.

Dentro do arquivo cereal.csv temos os dados de 77 cereais, com as seguintes variáveis:

  • name: Nome do cereal
  • mfr: Fabricante do cereal
    • A = American Home Food Products;
    • G = General Mills
    • K = Kelloggs
    • N = Nabisco
    • P = Post
    • Q = Quaker Oats
    • R = Ralston Purina
  • type: Tipo de cereal
    • C – cold
    • H – hot
  • calories: Calorias por porção
  • protein: Gramas de proteína
  • fat: Gramas de gordura
  • sodium: Miligramas de sódio
  • fiber: Gramas de fibra dietética
  • carbo: Gramas de carboidratos complexos
  • sugars: Gramas de açúcar
  • potass: Miligramas de potássio
  • vitamins: Vitaminas e minerais – 0, 25, ou 100, indicando a porcentagem recomendada diariamente
  • shelf: Localização do produto no supermercado (prateleira 1, 2, ou 3, contando do chão)
  • weight: Peso em onças da porção
  • cups: Número de copos em uma porção
  • rating: Classificação do cereal pelos consumidores

Essa será a base que utilizaremos para visualizar a aplicação do método query do Pandas, para que possamos perceber a sua utilidade na filtragem de dados em DataFrames, ressaltando a simplificação e melhoria de desempenho que ele proporciona.

Criação do DataFrame

Vamos criar e visualizar as cinco primeiras linhas do nosso DataFrame para verificarmos os dados que iremos encontrar.

import pandas as pd

BASE = "dados/cereal.csv"

df = pd.read_csv(BASE)
df.head()

Criação do DataFrame

Reconhecimento da Base de Dados

Quando fazemos o reconhecimento de uma base de dados, é comum executarmos uma série de procedimentos, entre eles, filtragens que nos permitem reconhecer e capturar dados com alguma característica específica.

Por exemplo, podemos estar interessados em buscar apenas os cereais com nota acima de 70. Essa é uma condição simples e filtraremos nosso DataFrame a partir dela.

Para isso, podemos utilizar a notação de colchetes do Pandas:

df[df["rating"] > 70]

Reconhecimento da Base de Dados

Esse é o método mais comum que temos de filtrar DataFrames no Pandas, e geralmente quando estamos começando, é o mais utilizado.

Método Query do Pandas

No entanto, existe um método no Pandas que pode ser mais legível, principalmente para alguns usuários que já tenham algum conhecimento em SQL, que é o método query.

A notação com query permite filtrar linhas de acordo com uma condição. Essa condição é definida no formato de uma string.

Aplicando o mesmo filtro que fizemos anteriormente, utilizando o método query, teríamos a seguinte linha de código:

df.query("rating > 70")

Reconhecimento da Base de Dados

Essa forma de definir o filtro como uma string torna o critério mais claro e legível. Isso tem feito com que haja uma migração crescente para o uso desse método devido à sua clareza e facilidade de compreensão, em comparação com a notação de colchetes.

E o resultado desse método ainda é um DataFrame, então podemos especificar apenas as colunas que desejamos visualizar passando uma lista dessas colunas dentro de colchetes.

df.query("rating > 70")[["name", "rating"]]

Especificando as colunas do DataFrame gerado pelo método query

O método query pode ser aplicado para diversos tipos de buscas. Por exemplo, podemos buscar um cereal com um nome específico no DataFrame.

Utilizando a notação de colchetes, temos:

df[df["name"] == "Almond Delight"]

Enquanto que, com o método Query, podemos fazer a mesma busca utilizando:

df.query("name == 'Almond Delight'")

E em ambas teremos o mesmo DataFrame como resultado.

buscar um cereal com um nome específico no DataFrame

Repare que, como estamos trabalhando com uma string dentro do método query, quando passamos uma informação que precisa estar entre aspas, essas aspas devem ser diferentes das aspas da string.

Ou seja, se a string do método foi passada com aspas duplas, a string interna deve ter aspas simples, ou vice-versa.

df.query('mfr == "N")

Exemplo de Dataframe para visualizar o uso das aspas no código

Operador AND com Notação de Colchetes e com Query

Até o momento, vimos tipos de filtragens simples, mas podemos realizar filtragens mais complexas utilizando operadores lógicos como and e or.

Vamos começar pelo operador and, fazendo um filtro no DataFrame a partir de um fabricante específico e um tipo de cereal consumido. Buscaremos pela Nabisco (N) e por cereais do tipo quente (H).

Com a notação de colchetes, esse filtro seria feito da seguinte forma:

df[(df["mfr"] == "N") & (df["type"] == "H")]

Lembre-se que no Pandas o operador and é representado pelo & (e comercial).

Já com o método query, teríamos:

df.query("mfr == 'N' and type == 'H'")

Como resultado para ambos os filtros, teríamos um DataFrame com uma única linha.

Operador AND com Notação de Colchetes e com Query

Do mesmo modo, podemos negar a segunda condição do nosso filtro, ou seja, podemos buscar pela fabricante Nabisco e pelos cereais que não são do tipo quente.

Em notação de colchetes, precisamos adicionar um til (~) na frente da segunda condição.

df[(df["mfr"] == "N") & ~(df["type"] == "H")]

Já com o método query, temos uma linguagem mais próxima do natural, apenas adicionando um not.

df.query("mfr == 'N' and not type == 'H'")

negar a segunda condição do nosso filtro

Ambas as consultas retornarão o mesmo DataFrame, porém repare como o método query tem uma leitura muito mais simples e legível do que a notação de colchetes. E quanto mais complexa fica a filtragem, maior essa diferença é perceptível.

Então, embora ambos os métodos sejam válidos e tragam o mesmo resultado, o método query pode ser preferido por sua clareza e compreensão do código, principalmente quando estamos trabalhando com equipes maiores.

Operador OR com Notação de Colchetes e com Query

Agora veremos alguns exemplos utilizando o operador or para combinar condições distintas na filtragem de dados. Lembrando que o or no Pandas é representado por |.

Vamos fazer uma busca semelhante à anterior, com o operador and, mas ao invés de filtrarmos por cereais que sejam da Nabisco e do tipo quente, iremos buscar por cereais que sejam da Nabisco ou do tipo quente.

Em notação de colchetes, temos:

df[(df["mfr"] == "N") | (df["type"] == "H")]

Reescrevendo com query, podemos fazer o mesmo da seguinte forma:

df.query("mfr == 'N' or type == 'H'")

Operador OR com Notação de Colchetes e com Query

Observe que nosso DataFrame filtrado apresenta tanto os cereais da Nabisco, sejam eles quentes ou frios, quanto cereais de outras marcas que são do tipo quente.

Operador IN com Notação de Colchetes e com Query

Geralmente, quando vamos filtrar informações de um DataFrame, temos uma lista com as informações que queremos buscar dentro dele. Nesses casos, utilizamos o operador in.

Por exemplo, vamos filtrar nosso DataFrame de acordo com os fabricantes Ralston Purina (R), Nabisco (N) e American Home Food Products (A).

Com a notação de colchetes, utilizaríamos para essa filtragem o método isin():

df[df["mfr"].isin(["R", "N", "A"])]

Já com o método query, podemos apenas utilizar o operador in dentro da string:

df.query("mfr in ['R', 'N', 'A']")

Operador IN com Notação de Colchetes e com Query

Usando Variáveis com Notação de Colchetes e com Query

No exemplo anterior, utilizamos a lista diretamente dentro dos filtros. No entanto, é mais interessante utilizarmos uma variável para armazenar essa lista, facilitando futuras alterações nos critérios de filtragem sem precisar modificar todo o código.

Dessa forma, na notação de colchetes podemos continuar utilizando o método isin:

empresas_de_interesse = ["R", "N", "A"]
df[df["mfr"].isin(empresas_de_interesse)]

Já no método query, antes do nome da variável precisamos adicionar um @:

empresas_de_interesse = ["R", "N", "A"]
df.query("mfr in @empresas_de_interesse")

Operador IN com Notação de Colchetes e com Query

Da mesma forma, poderíamos filtrar os registros que não correspondem às empresas de interesse.

Com notação de colchetes, adicionamos o til (~):

df[~df["mfr"].isin(empresas_de_interesse)]

E com o query, adicionamos o not:

df.query("mfr not in @empresas_de_interesse")

Usando Variáveis com Notação de Colchetes e com Query

Condições com Operações Matemáticas

Também é possível utilizar essas duas abordagens para realizar filtros tendo como critérios operações matemáticas. Por exemplo, podemos buscar cereais com um somatório menor que 20 entre carboidratos complexos e gramas de açúcar.

É possível fazer isso com a notação de colchetes:

df[df["carbo"] + df["sugars"] < 20]

E com o método query:

df.query("carbo + sugars < 20")

Condições com Operações Matemáticas

Perceba como o método query torna a leitura muito mais simples e clara.

E da mesma forma, obteremos o mesmo resultado se utilizarmos variáveis para armazenar essas condições.

Notação de colchetes:

condicao_carbo_sugars = df["carbo"] + df["sugars"] < 20
df[condicao_carbo_sugars]

Método query:

condicao_carbo_sugars = df["carbo"] + df["sugars"] < 20
df.query("@condicao_carbo_sugars")

Condições com Operações Matemáticas

Operações com Strings

Assim como temos as operações matemáticas, podemos aplicar operações com strings como critérios. Vamos filtrar, por exemplo, os cereais que contenham uma determinada string, como Bran.

Em notação de colchetes teremos:

df[df["name"].str.contains("Bran")]

Enquanto com querys podemos fazer da seguinte forma:

df.query("name.str.contains('Bran')")

Operações com Strings

Observe que em ambos os casos o método str.contains precisa ser aplicado para encontrar todas as instâncias em que a string desejada está presente nos nomes dos cereais.

Conclusão – Dominando o Método Query do Pandas

Na aula de hoje, vimos diversos exemplos de como utilizar a notação com colchetes e a notação com o método query do Pandas para filtrar os dados de um DataFrame.

O uso eficaz do método query pode simplificar significativamente a manipulação e filtragem de dados complexos no Pandas.

Além disso, vimos como utilizar as variáveis nesse processo torna o código mais flexível e permite ajustes rápidos nas condições e características filtradas, sendo uma maneira mais eficiente de fazer a manutenção do código.

Hashtag Treinamentos

Para acessar outras publicações de Ciência de Dados, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?

Quer sair do zero no Excel e virar uma referência na sua empresa?
Inscreva-se agora no Excel Impressionador!