Classificando valores
Atribua classificações aos valores de uma coluna com rank(), escolha métodos para desempate e crie faixas de percentis com pd.cut().
Classificando valores é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que é classificação?
Classificação atribui a cada valor de uma Series uma posição com base em sua magnitude relativa — classificação 1 para o menor valor e classificação n para o maior (ou vice-versa). Diferentemente da ordenação (que reordena as linhas), rank() adiciona uma nova coluna de posições ordinais junto aos dados originais. As classificações são usadas em tabelas de classificação, no cálculo de percentis e em determinados testes estatísticos que exigem a posição ordinal em vez dos valores absolutos.
import pandas as pd
df = pd.DataFrame({
'player': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
'score': [88, 72, 95, 72, 85]
})
df['rank'] = df['score'].rank()
print(df)
# player score rank
# 0 Alice 88 4.0
# 1 Bob 72 1.5 <- tied with Dave
# 2 Carol 95 5.0
# 3 Dave 72 1.5 <- tied with Bob
# 4 Eve 85 3.0Classificação crescente vs. decrescente
Por padrão, rank() atribui a classificação 1 ao valor menor (ordem crescente). Para atribuir a classificação 1 ao maior valor (por exemplo, o primeiro lugar em uma competição), passe ascending=False. Isso segue a convenção de “primeiro lugar = maior pontuação” usada em esportes, tabelas de classificação e classificações de vendas.
import pandas as pd
df = pd.DataFrame({'score': [70, 95, 85, 60, 90]})
# Rank 1 = highest score
df['competition_rank'] = df['score'].rank(ascending=False)
print(df)
# score competition_rank
# 0 70 4.0
# 1 95 1.0
# 2 85 3.0
# 3 60 5.0
# 4 90 2.0Métodos de desempate
Quando várias linhas têm o mesmo valor (um empate), o parâmetro method decide como as classificações são atribuídas. As opções são: 'average' (padrão — as linhas empatadas compartilham a classificação média), 'min' (todas as linhas empatadas recebem a menor classificação), 'max' (todas recebem a maior), 'first' (a linha que aparece primeiro recebe a menor classificação) e 'dense' (não há lacunas nos números de classificação após um empate).
import pandas as pd
s = pd.Series([10, 20, 20, 30])
print('average:', s.rank(method='average').tolist()) # [1.0, 2.5, 2.5, 4.0]
print('min: ', s.rank(method='min').tolist()) # [1.0, 2.0, 2.0, 4.0]
print('max: ', s.rank(method='max').tolist()) # [1.0, 3.0, 3.0, 4.0]
print('first: ', s.rank(method='first').tolist()) # [1.0, 2.0, 3.0, 4.0]
print('dense: ', s.rank(method='dense').tolist()) # [1.0, 2.0, 2.0, 3.0]Classificação densa: sem lacunas após empates
O método 'dense' é especialmente útil quando você deseja uma classificação sem lacunas. Com 'min', duas entradas empatadas em 2º lugar fazem com que a próxima classificação seja 4 (pulando a 3). Com 'dense', a próxima classificação é sempre 3, mantendo uma sequência contínua. A classificação densa é o padrão na função de janela DENSE_RANK() do SQL e é usada com frequência em tabelas de classificação.
import pandas as pd
df = pd.DataFrame({
'name': ['A', 'B', 'C', 'D', 'E'],
'score': [100, 80, 80, 60, 60]
})
df['dense_rank'] = df['score'].rank(method='dense', ascending=False).astype(int)
print(df)
# name score dense_rank
# 0 A 100 1
# 1 B 80 2
# 2 C 80 2 <- same score, same rank
# 3 D 60 3 <- next rank is 3, not 4
# 4 E 60 3Classificação por percentil com pct=True
Definir pct=True em rank() normaliza as classificações para o intervalo [0, 1], fornecendo uma classificação por percentil. Um valor com classificação por percentil 0.8 significa que ele é maior que 80% dos valores da coluna. Isso é usado em finanças (desempenho por percentil), avaliação (percentis de pontuação) e detecção de valores atípicos.
import pandas as pd
df = pd.DataFrame({'score': [50, 70, 80, 90, 100]})
df['percentile'] = df['score'].rank(pct=True)
print(df)
# score percentile
# 0 50 0.2
# 1 70 0.4
# 2 80 0.6
# 3 90 0.8
# 4 100 1.0Classificação dentro de grupos
Para calcular classificações dentro de cada grupo de forma independente (por exemplo, a classificação salarial de cada departamento), combine groupby() com rank(). Use groupby().rank(), que aplica a função de classificação grupo a grupo e retorna uma Series alinhada ao índice do DataFrame original — perfeita para adicionar uma coluna de “classificação dentro do grupo”.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
'salary': [90000, 70000, 55000, 65000, 80000]
})
df['dept_rank'] = df.groupby('dept')['salary'].rank(
method='dense', ascending=False
).astype(int)
print(df.sort_values(['dept', 'dept_rank']))
# dept name salary dept_rank
# 0 Eng Alice 90000 1
# 4 Eng Eve 80000 2
# 1 Eng Bob 70000 3
# 3 HR Dave 65000 1
# 2 HR Carol 55000 2pd.cut() para intervalos de mesma largura
pd.cut(series, bins) divide uma coluna numérica contínua em intervalos de mesma largura (faixas) e atribui cada valor à sua faixa. Isso converte uma variável contínua em uma variável categórica, sendo útil para histogramas, grupos etários, faixas de renda ou qualquer tarefa de discretização. O resultado é uma Series categórica com rótulos de intervalo.
import pandas as pd
df = pd.DataFrame({'age': [5, 15, 25, 35, 45, 55, 65, 75]})
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100],
labels=['Child', 'Young Adult', 'Middle Age', 'Senior'])
print(df)
# age age_group
# 0 5 Child
# 1 15 Child
# 2 25 Young Adult
# 3 35 Young Adult
# 4 45 Middle Age
# 5 55 Middle Age
# 6 65 Senior
# 7 75 Seniorpd.qcut() para intervalos com a mesma frequência
pd.qcut(series, q) divide os valores em faixas baseadas em quantis, nas quais cada faixa contém aproximadamente o mesmo número de observações. Diferentemente de pd.cut() (mesma largura), pd.qcut() produz grupos do mesmo tamanho — útil para segmentação baseada em percentis, como classificações em decis, divisões em quintis ou agrupamentos em quartis.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'score': np.random.randint(40, 100, 20)})
# Split into 4 equal-frequency quartiles
df['quartile'] = pd.qcut(df['score'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(df['quartile'].value_counts().sort_index())
# Q1 5
# Q2 5
# Q3 5
# Q4 5cut() vs qcut() — principais diferenças
Use pd.cut() quando suas faixas tiverem um significado natural no domínio (por exemplo, faixas etárias de 0–18, 18–35 e 35–60) — a largura das faixas tem importância semântica. Use pd.qcut() quando quiser grupos do mesmo tamanho, independentemente de onde estejam os limites — por exemplo, dividindo clientes nos quartis superior e inferior. Uma distribuição assimétrica produzirá grupos muito desiguais com cut(), mas grupos iguais com qcut().
import pandas as pd
import numpy as np
np.random.seed(0)
# Skewed distribution: most values near 0
skewed = pd.Series(np.random.exponential(scale=5, size=100).round())
# cut with equal width: many empty or tiny upper bins
cut_counts = pd.cut(skewed, bins=4).value_counts().sort_index()
print('cut():', cut_counts.values)
# qcut with equal frequency: always 25 per group
qcut_counts = pd.qcut(skewed, q=4).value_counts().sort_index()
print('qcut():', qcut_counts.values)Adicionando o número da classificação como coluna
Um padrão simples para produzir uma tabela de resultados classificados é: ordenar de forma decrescente, redefinir o índice começando em 0, somar 1 para obter uma classificação legível começando em 1 e exibir o resultado junto aos dados originais. Isso produz uma tabela de classificação pronta para apresentação, sem lacunas e com números de classificação limpos.
import pandas as pd
df = pd.DataFrame({
'team': ['Falcons', 'Eagles', 'Hawks', 'Owls'],
'wins': [12, 9, 12, 7]
})
leaderboard = (
df
.sort_values('wins', ascending=False)
.reset_index(drop=True)
)
leaderboard.index = leaderboard.index + 1
leaderboard.index.name = 'place'
print(leaderboard)Classificação como recurso para aprendizado de máquina
Recursos transformados por classificação são úteis no aprendizado de máquina porque são robustos a valores atípicos — um valor muito grande ou muito pequeno recebe uma classificação próxima de um dos extremos, em vez de distorcer a distribuição do recurso. A transformação por classificação às vezes é usada como etapa de pré-processamento antes de modelos baseados em árvores ou quando a escala numérica não é significativa, mas a ordenação relativa é.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'income': [30000, 50000, 70000, 1_000_000] # outlier at 1M
})
# Add rank as a feature
df['income_rank'] = df['income'].rank(pct=True)
print(df)
# income income_rank
# 0 30000 0.25
# 1 50000 0.50
# 2 70000 0.75
# 3 1000000 1.00
# The outlier has rank 1.0 — extreme but not disproportionateVerificação rápida
Teste sua compreensão sobre a classificação de valores no Pandas.
Recapitulação da lição
Nesta lição, você aprendeu que rank() atribui posições ordinais aos valores, method='dense' evita lacunas após empates, pct=True fornece classificações por percentil em [0,1] e groupby().rank() calcula classificações dentro de grupos. Use pd.cut() para faixas de mesma largura e pd.qcut() para faixas com a mesma frequência ao discretizar variáveis contínuas. A seguir, vamos definir e redefinir o índice do DataFrame.
Perguntas Frequentes
A aula “Classificando valores” é grátis?
Sim — o texto completo de “Classificando valores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Classificando valores”?
Atribua classificações aos valores de uma coluna com rank(), escolha métodos para desempate e crie faixas de percentis com pd.cut(). Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Classificando valores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Ordenando por valores das colunas
- Ordenando pelo índice
- Classificando valores
- Definindo e redefinindo o índice