Se você já ficou na dúvida entre usar loc ou iloc para selecionar dados de um DataFrame do Pandas, saiba que não está sozinho! 🤔 Embora pareçam similares, a diferença fundamental entre indexação por rótulo e por posição inteira pode levar a resultados inesperados ou erros. Neste tutorial, vamos usar um conjunto de dados de desempenho estudantil para desmistificar esses dois métodos essenciais. Confira a fonte original para se aprofundar.

Conceito Central: Rótulo (loc) vs Posição Inteira (iloc)
O loc seleciona dados com base nos rótulos (nomes) das linhas e colunas. Já o iloc seleciona com base nas posições inteiras (indexação começando em 0). Essa distinção é crucial, viu?
Vamos preparar um DataFrame de exemplo e ver a diferença na prática.
import pandas as pd
# Criando dados de exemplo
data = {
'student_id': [101, 102, 103, 104, 105],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Edward'],
'math': [85, 58, 92, 76, 88],
'english': [90, 64, 78, 81, 95],
'science': [92, 70, 85, 79, 91]
}
df = pd.DataFrame(data)
# Definindo 'student_id' como índice
df.set_index('student_id', inplace=True)
print(df)
Agora, vamos selecionar os mesmos dados (o registro do Bob) usando os dois métodos.
# Usando loc: Seleciona pelo rótulo (102)
bob_loc = df.loc[102]
print("Resultado do loc:")
print(bob_loc)
print()
# Usando iloc: Seleciona pela posição (1) - lembra que começa em 0!
bob_iloc = df.iloc[1]
print("Resultado do iloc:")
print(bob_iloc)
Os dois imprimem os dados do Bob, mas a lógica é diferente: o loc encontra a linha com o rótulo 102, enquanto o iloc simplesmente pega a segunda linha (posição 1).

Padrões de Uso Comuns na Prática
1. Selecionando Múltiplas Linhas/Colunas
Você pode passar uma lista de rótulos ou posições. Olha só:
# loc: Seleciona múltiplos alunos por lista de rótulos
selected_loc = df.loc[[101, 103, 105]]
# iloc: Seleciona múltiplos alunos por lista de posições
selected_iloc = df.iloc[[0, 2, 4]]
2. A Diferença CRÍTICA no Fatiamento (Slicing)
No fatiamento, o loc inclui o rótulo final, enquanto o iloc exclui a posição final (igual ao fatiamento padrão do Python).
# Fatiamento com loc (inclui o rótulo 103)
sliced_loc = df.loc[101:103]
# Fatiamento com iloc (exclui a posição 3)
sliced_iloc = df.iloc[0:3]
Se você não entender isso, pode causar sobreposição ou falhas ao dividir dados em pedaços (chunks).
3. Filtragem Booleana
O loc é a escolha natural para filtrar linhas baseado em condições. É bem mais fácil!
# Estudantes com nota de matemática > 80
high_math = df.loc[df['math'] > 80]
# Estudantes com matemática > 70 E ciências > 80
high_scores = df.loc[(df['math'] > 70) & (df['science'] > 80)]
Fazer isso com iloc requer converter a Series booleana em uma lista, o que é menos intuitivo.

Conclusão: Quando Usar Cada Um?
- Use
locquando: Seu DataFrame tem rótulos significativos (ex: IDs, datas) e você quer selecionar/filtrar com base neles. A legibilidade do código é importante, ou você precisa de filtragem booleana. - Use
ilocquando: Os rótulos estão ausentes ou não têm significado, e você se importa com posições absolutas (ex: primeiras 100 linhas). Quando os rótulos podem ser duplicados ou mudar, e você precisa de um código robusto baseado em posição.
Pense no loc como "chamar pelo nome" e no iloc como "chamar pelo número". 🎯 Escolher a ferramenta certa baseada na estrutura dos seus dados e na sua tarefa vai tornar seus fluxos de trabalho com Pandas muito mais eficientes e livres de erros. Bora testar os exemplos de código para fixar o conceito!