Pandas: Seleção de Dados
Última atualização: 2026-08-26
A seleção de dados é a operação mais frequente na análise de dados—"mostre-me os dados que atendem a estas condições." O Pandas oferece um rico conjunto de métodos de seleção: por rótulo, por posição, por condição, por expressão, e até mesmo por strings de consulta semelhantes a SQL. Esta seção orienta você em cada método de seleção e ajuda a evitar o erro mais comum de "indexação encadeada".
1. What You Will Learn
- ❶ loc label selection
- ❷ iloc position selection
- ❸ Conditional filtering (booleano indexing)
- ❹ The query método
- ❺ isin filtering and the chained indexing pitfall
2. Necessidades de Filtragem de Produtos do Charlie
(1) O Ponto de Dor: Combinar Múltiplas Condições É Muito Trabalhoso
Charlie precisa filtrar "Produtos de Eletrônicos com preço > 50 e avaliação > 4.0" de 1000 produtos. Ele primeiro escreveu uma longa sequência de condições usando indexação booleana:
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard',
'Mouse', 'Headset', 'Speaker', 'Camera', 'Charger'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics',
'Accessories', 'Accessories', 'Accessories', 'Accessories',
'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99,
29.99, 149.99, 89.99, 599.99, 19.99],
'stock': [50, 120, 80, 35, 200, 300, 150, 180, 25, 500],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2, 4.0, 4.4, 4.1, 4.8, 3.9]
})
# Indexação booleana — funciona, mas é verboso
result = df[(df['price'] > 50) & (df['rating'] > 4.0) & (df['category'] == 'Electronics')]
print(result[['name', 'price', 'rating']])
# name price rating
# 0 Laptop 999.99 4.7
# 1 Phone 699.99 4.5
# 2 Tablet 349.99 4.3
# 3 Monitor 449.99 4.6
# 8 Camera 599.99 4.8
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(2) A Solução: O Método query É Mais Legível
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: Consultas legíveis com query (Dificuldade ⭐⭐)
# Mesmo resultado, muito mais legível
result = df.query('price > 50 and rating > 4.0 and category == "Electronics"')
print(result[['name', 'price', 'rating']])
# Com variável
min_price = 50
min_rating = 4.0
result2 = df.query('price > @min_price and rating > @min_rating')
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(3) O Benefício: Quatro Métodos de Seleção, Cada Um com Seus Pontos Fortes
| Método | Sintaxe | Melhor Para |
|---|---|---|
| loc | df.loc[linha, coluna] |
Seleção precisa por rótulo |
| iloc | df.iloc[r, c] |
Seleção baseada em posição |
| Indexação booleana | df[condição] |
Condições simples |
| query | df.query('expressão') |
Filtros com múltiplas condições complexas |
3. loc: Seleção por Rótulo
(1) Sintaxe do loc
df.loc[rotulo_linha, rotulo_coluna] — seleciona por rótulo; as fatias incluem o ponto final.
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: seleção por rótulo com loc (Dificuldade ⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
}, index=['A001', 'A002', 'A003', 'A004', 'A005'])
# Única linha por rótulo
print(df.loc['A001'])
# name Laptop
# price 999.99
# stock 50
# Múltiplas linhas
print(df.loc[['A001', 'A003']])
# Fatia de linhas + fatia de colunas (rótulos, INCLUI o ponto final)
print(df.loc['A001':'A003', 'name':'price'])
# name price
# A001 Laptop 999.99
# A002 Phone 699.99
# A003 Tablet 349.99
# Linhas específicas + colunas específicas
print(df.loc[['A001', 'A004'], ['name', 'stock']])
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(2) Seleção Condicional com loc
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: loc + condição (Dificuldade ⭐⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
})
# Filtrar linhas + selecionar colunas em uma operação
expensive = df.loc[df['price'] > 400, ['name', 'price']]
print(expensive)
# name price
# 0 Laptop 999.99
# 1 Phone 699.99
# 3 Monitor 449.99
# Com atribuição (seguro — sem indexação encadeada)
df.loc[df['stock'] < 50, 'stock'] = 50 # reabastecer itens com estoque baixo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
4. iloc: Seleção por Posição
(1) Sintaxe do iloc
df.iloc[linha_pos, coluna_pos] — seleciona por posição inteira; as fatias excluem o ponto final (estilo Python).
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: seleção por posição com iloc (Dificuldade ⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
})
# Uma única linha por posição
print(df.iloc[0]) # primeira linha (Laptop)
# Múltiplas linhas por lista de posições
print(df.iloc[[0, 2, 4]])
# Fatia de linhas + fatia de colunas (posições, EXCLUI o ponto final)
print(df.iloc[0:3, 0:2])
# name price
# 0 Laptop 999.99
# 1 Phone 699.99
# 2 Tablet 349.99
# Últimas 2 linhas
print(df.iloc[-2:])
# A cada outra linha
print(df.iloc[::2])
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então por favor instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(2) Principais Diferenças Entre loc e iloc
| Característica | loc | iloc |
|---|---|---|
| Base do índice | Rótulo | Posição inteira |
| Ponto final da fatia | Inclui o ponto final | Exclui o ponto final |
| Rótulos de string | ✅ | ❌ |
| Índices negativos | ❌ | ✅ |
| Filtragem condicional | ✅ | ❌ |
| Cenário recomendado | Quando você conhece o nome | Quando você conhece a posição |
df.loc[0:3] inclui as linhas 0,1,2,3 (4 linhas), enquanto df.iloc[0:3] inclui as linhas 0,1,2 (3 linhas). Este é o ponto mais comum de confusão entre loc e iloc.
5. Filtragem Condicional (Indexação Booleana)
(1) Condições Única e Múltipla
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: Filtragem condicional (Dificuldade ⭐⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
# Single condition
print(df[df['price'] > 400])
# Multiple conditions: & (AND), | (OR), ~ (NOT)
# MUST use parentheses around each condition!
high_price_good_rating = df[(df['price'] > 400) & (df['rating'] >= 4.5)]
print(high_price_good_rating[['name', 'price', 'rating']])
# OR condition
hot_items = df[(df['price'] > 500) | (df['stock'] > 100)]
print(hot_items[['name', 'price', 'stock']])
# NOT condition
not_electronics = df[~(df['category'] == 'Electronics')]
print(not_electronics)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
& / | / ~, não and / or / not. Cada condição deve estar entre parênteses, caso contrário, a precedência do operador causará um erro.
(2) Condições de String
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: Filtragem por condição de string (Dificuldade ⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Wireless Mouse', 'USB Keyboard', 'Bluetooth Headset',
'Wireless Speaker', 'USB Camera'],
'price': [29.99, 79.99, 149.99, 89.99, 599.99]
})
# Contains substring
wireless = df[df['name'].str.contains('Wireless')]
print(wireless)
# Starts with
usb = df[df['name'].str.startswith('USB')]
print(usb)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
6. O Método query
(1) Sintaxe Básica
df.query('expression') — filtra linhas usando uma expressão string, oferecendo legibilidade mais próxima do SQL.
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então por favor instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: consultas de expressão query (Dificuldade ⭐⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
# Condição simples
print(df.query('price > 400'))
# Múltiplas condições (and/or em vez de &/|)
print(df.query('price > 400 and rating >= 4.5'))
# Comparação de strings
print(df.query('category == "Electronics"'))
# Use @ para referenciar variáveis Python
threshold = 100
print(df.query('stock > @threshold'))
# Nomes de colunas com espaços (crase)
# df.query('`unit price` > 100')
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então por favor instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(2) query vs. Indexação Booleana
| Recurso | Indexação Booleana | query |
|---|---|---|
| Sintaxe | df[(df.a>1) & (df.b<2)] |
df.query('a>1 and b<2') |
| Legibilidade | Parênteses aninhados | Próximo ao SQL |
| Referência a variável | Usado diretamente | Requer o prefixo @ |
| Nomes de colunas com espaços | Sem problema | Requer crases |
| Desempenho | Ligeiramente mais lento (DF grande) | Ligeiramente mais rápido (motor otimizado) |
| Flexibilidade | Máxima | Limitada pela sintaxe da expressão |
7. Filtro por isin
(1) Correspondência de Múltiplos Valores
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e siga junto. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: filtragem por isin com múltiplos valores (Dificuldade ⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99]
})
# Filtra por múltiplos valores de categoria
target_cats = ['Electronics', 'Audio']
# Nota: Audio não está nos dados → sem correspondência, sem erro
result = df[df['category'].isin(target_cats)]
print(result[['name', 'category']])
# Negação: NÃO está na lista
other = df[~df['category'].isin(['Electronics'])]
print(other)
# Somente Accessories
# isin com valores numéricos
target_prices = [999.99, 79.99]
print(df[df['price'].isin(target_prices)])
# Laptop e Keyboard
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e siga junto. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
(2) isin vs. == para Múltiplos Valores
| Método | Sintaxe | Caso de Uso |
|---|---|---|
| isin | df[col].isin([v1,v2,v3]) |
Correspondência de múltiplos valores |
| == | df[col] == v1 |
Correspondência de valor único |
| | combinação | (df[col]==v1) | (df[col]==v2) |
Alguns múltiplos valores |
| query | df.query('col in ["v1","v2"]') |
Correspondência de múltiplos valores legível |
8. A Armadilha do Encadeamento de Índices
(1) O que é Encadeamento de Índices
▶ Exemplo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, portanto, instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: O perigo oculto do encadeamento de índices (Dificuldade ⭐⭐)
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet'],
'price': [999.99, 699.99, 349.99],
'category': ['Electronics', 'Electronics', 'Electronics']
})
# ❌ Encadeamento de índices — pode acionar SettingWithCopyWarning
# df[df['price'] > 400]['price'] = 0 # Imprevisível!
# ✅ Operação única com loc
df.loc[df['price'] > 400, 'price'] = 0 # Sempre funciona
# ❌ Outra forma encadeada
# df[df['category'] == 'Electronics']['stock'] = 100
# ✅ Abordagem correta
df.loc[df['category'] == 'Electronics', 'stock'] = 100
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, portanto, instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
df[condição][coluna] = valor pode não modificar o DataFrame original (o resultado intermediário é uma cópia). A forma correta de escrever é: df.loc[condição, coluna] = valor — uma operação única que especifica linhas e colunas de uma só vez.
(2) Árvore de Decisão para Seleção Segura
graph TB
Q["Precisa selecionar dados?"] -->|"Somente leitura"| LOC["loc / iloc / boolean"]
Q -->|"Leitura + Atribuição"| SAFE["loc[cond_linha, col] = valor"]
Q -->|"Filtro complexo"| QUERY["query()"]
Q -->|"Correspondência de múltiplos valores"| ISIN["isin()"]
SAFE --> WARN["❌ Nunca: df[cond][col] = val"]
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, portanto, instale-o em sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
9. Exemplo Completo: Filtragem Multidimensional de Produtos para E-Commerce
▶ Exemplo
> **Saída:** Execute isso em um ambiente local do Python (pandas 2.x). O servidor Piston não tem pandas pré-instalado, por favor instale na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
: O fluxo completo de filtragem de produtos (Dificuldade ⭐⭐⭐)
import pandas as pd
import numpy as np
# ============================================
# Exemplo abrangente: Fluxo de trabalho de
# seleção multidimensional de produtos
# e-commerce
# ============================================
# 1. Criar catálogo de produtos
np.random.seed(42)
df = pd.DataFrame({
'name': [f'Product_{i:03d}' for i in range(1, 51)],
'category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports'], 50),
'price': np.round(np.random.uniform(10, 500, 50), 2),
'stock': np.random.randint(0, 300, 50),
'rating': np.round(np.random.uniform(3.0, 5.0, 50), 1),
'brand': np.random.choice(['Alpha', 'Beta', 'Gamma', 'Delta'], 50)
})
# 2. loc: seleção precisa
print("=== Eletrônicos com preço > 200 ===")
elec_expensive = df.loc[
(df['category'] == 'Electronics') & (df['price'] > 200),
['name', 'price', 'rating']
]
print(elec_expensive.head())
# 3. iloc: seleção baseada em posição
print("\n=== Primeiras 3 linhas, primeiras 4 colunas ===")
print(df.iloc[:3, :4])
# 4. Boolean: múltiplas condições
print("\n=== Alta classificação, em estoque, abaixo de $100 ===")
bargains = df[(df['rating'] >= 4.5) & (df['stock'] > 0) & (df['price'] < 100)]
print(bargains[['name', 'price', 'rating', 'stock']])
# 5. query: filtro complexo legível
print("\n=== Marca Alpha Eletrônicos ou Casa, classificação >= 4.0 ===")
query_result = df.query(
'brand == "Alpha" and category in ["Electronics", "Home"] and rating >= 4.0'
)
print(query_result[['name', 'category', 'rating']])
# 6. isin: filtro de múltiplos valores
print("\n=== Marcas selecionadas ===")
top_brands = df[df['brand'].isin(['Alpha', 'Beta'])]
print(f"Produtos Alpha + Beta: {len(top_brands)}")
# 7. Atribuição segura
df.loc[df['stock'] == 0, 'status'] = 'Fora de Estoque'
df.loc[df['stock'] > 0, 'status'] = 'Em Estoque'
print(f"\n=== Status do Estoque ===")
print(df['status'].value_counts())
> **Saída:** Execute isso em um ambiente local do Python (pandas 2.x). O servidor Piston não tem pandas pré-instalado, por favor instale na sua máquina (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.
❓ Perguntas Frequentes
df['a'] > 1 & df['b'] < 2 é interpretado como df['a'] > (1 & df['b']) < 2, o que gera um erro. Você deve escrever (df['a'] > 1) & (df['b'] < 2). Você não pode usar and/or/not—eles não suportam operações elemento a elemento no nível do array.df[condition][col] = value são duas operações separadas: a primeira pode retornar uma view ou uma cópia, e atribuir a uma cópia na segunda etapa não afetará o DataFrame original. Isso leva ao bug sutil de "Eu mudei, mas não surtiu efeito." A maneira correta de escrever é: df.loc[condition, col] = value, uma única operação que especifica linhas e colunas de uma vez.df.query('price > @min_price'). Para nomes de colunas com espaços, use crases: df.query('unit price > 100'). Dentro do query, palavras-chave como and/or/not/in são suportadas, tornando-o mais próximo da linguagem natural.df[col].isin([v1,v2,v3]) é equivalente a (df[col]==v1) | (df[col]==v2) | (df[col]==v3), mas é mais conciso e eficiente. Use ~df[col].isin(...) quando precisar de negação.df[df.a > 0] = 1 define toda a linha como 1 (não apenas a coluna a). A forma correta é: df.loc[df.a > 0, 'a'] = 1. Sempre use loc para especificar tanto a condição de linha quanto a coluna de destino ao mesmo tempo.📖 Resumo
locseleciona por rótulo, e os slices incluem o ponto final;ilocselecione por posição, e os slices excluem o ponto final- Use indexação booleana para filtragem condicional, e combine múltiplas condições com
&/|/~(parênteses são obrigatórios) - O método
queryusa expressões de string, oferecendo legibilidade mais próxima do SQL, e suporta referências@variable isiné usado para correspondência de múltiplos valores, e é mais conciso e eficiente do que combinar múltiplos==com|- Indexação encadeada
df[cond][col] = valé um bug sutil; você deve usardf.loc[cond, col] = val - Use
.str.contains()/.str.startswith()e métodos similares para filtragem de condições de strings - Decisões de seleção: para leitura de dados →
loc/iloc/query/isin; para atribuição →loc[row_condition, column_name]
📝 Exercícios
- Básico (Dificuldade ⭐): Crie um DataFrame de alunos (nome / matemática / inglês / ciências). Use
locpara selecionar as colunas nome e matemática dos alunos com nota em matemática > 80, e useilocpara selecionar as 3 primeiras linhas. - Intermediário (Dificuldade ⭐⭐): Filtre os mesmos dados de 3 maneiras (indexação booleana / query / isin): preço entre 50 e 200, e categoria é Eletrônicos ou Casa. Compare a quantidade de código e a legibilidade.
- Desafio (Dificuldade ⭐⭐⭐): Crie um DataFrame de produtos com 50 linhas e complete 5 exercícios de seleção:
loccom linha única /iloccom fatiamento / booleano com múltiplas condições /querycom variável /isincom múltiplos valores. Após cada seleção, atribua com segurança uma nova coluna de marcador usandoloce, por fim, conte a quantidade de cada marcador.