Pandas Sort Values: Guia completo para ordenar DataFrames em Python
Updated on
Dados não ordenados são difíceis de analisar. Você percorre milhares de linhas tentando encontrar as maiores vendas, as datas mais recentes ou as menores taxas de erro -- e perde padrões que seriam óbvios se os dados estivessem ordenados. Ordenar uma lista Python funciona para casos simples, mas DataFrames têm múltiplas colunas, tipos mistos e valores ausentes que listas não conseguem lidar.
Pandas sort_values() ordena qualquer DataFrame por uma ou mais colunas, com controle total sobre ordem crescente/decrescente, posicionamento de nulos e estabilidade. Este guia cobre todos os padrões de ordenação que você encontrará no trabalho real com dados.
Ordenação básica com sort_values()
Ordenar por uma única coluna
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'score': [85, 92, 78, 95, 88],
'age': [25, 30, 22, 28, 35]
})
# Ordenar por score (crescente por padrão)
sorted_df = df.sort_values('score')
print(sorted_df)
# name score age
# 2 Charlie 78 22
# 0 Alice 85 25
# 4 Eve 88 35
# 1 Bob 92 30
# 3 Diana 95 28Ordenar de forma decrescente
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'score': [85, 92, 78, 95, 88],
'age': [25, 30, 22, 28, 35]
})
# Maiores pontuações primeiro
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
# name score age
# 3 Diana 95 28
# 1 Bob 92 30
# 4 Eve 88 35
# 0 Alice 85 25
# 2 Charlie 78 22Ordenar no local
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
})
# Modificar df diretamente (nenhuma cópia criada)
df.sort_values('score', inplace=True)
print(df)
# name score
# 2 Charlie 78
# 0 Alice 85
# 1 Bob 92Ordenação por múltiplas colunas
Ordenar por várias colunas
import pandas as pd
df = pd.DataFrame({
'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'salary': [70000, 85000, 65000, 90000, 70000]
})
# Ordenar primeiro por departamento, depois por salário dentro de cada departamento
sorted_df = df.sort_values(['department', 'salary'])
print(sorted_df)
# department name salary
# 1 Engineering Bob 85000
# 3 Engineering Diana 90000
# 2 Sales Charlie 65000
# 0 Sales Alice 70000
# 4 Sales Eve 70000Misto crescente/decrescente
import pandas as pd
df = pd.DataFrame({
'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'salary': [70000, 85000, 65000, 90000, 70000]
})
# Departamento crescente, salário decrescente
sorted_df = df.sort_values(
['department', 'salary'],
ascending=[True, False]
)
print(sorted_df)
# department name salary
# 3 Engineering Diana 90000
# 1 Engineering Bob 85000
# 0 Sales Alice 70000
# 4 Sales Eve 70000
# 2 Sales Charlie 65000Tratamento de valores ausentes (NaN)
Por padrão, os valores NaN vão para o final independentemente da ordem de classificação. Use na_position para controlar:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'score': [85, np.nan, 78, np.nan]
})
# NaN no final (padrão)
print(df.sort_values('score'))
# name score
# 2 Charlie 78.0
# 0 Alice 85.0
# 1 Bob NaN
# 3 Diana NaN
# NaN no início
print(df.sort_values('score', na_position='first'))
# name score
# 1 Bob NaN
# 3 Diana NaN
# 2 Charlie 78.0
# 0 Alice 85.0Ordenar por índice com sort_index()
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
}, index=[2, 0, 1])
# Ordenar por índice
print(df.sort_index())
# name score
# 0 Bob 92
# 1 Charlie 78
# 2 Alice 85
# Ordenar por nomes de colunas (axis=1)
df2 = pd.DataFrame({
'c': [1, 2], 'a': [3, 4], 'b': [5, 6]
})
print(df2.sort_index(axis=1))
# a b c
# 0 3 5 1
# 1 4 6 2Redefinir índice após ordenação
Após a ordenação, o índice original é preservado. Para obter um índice sequencial limpo:
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
})
sorted_df = df.sort_values('score').reset_index(drop=True)
print(sorted_df)
# name score
# 0 Charlie 78
# 1 Alice 85
# 2 Bob 92Use drop=True para descartar o índice antigo. Sem ele, o índice antigo se torna uma coluna.
Ordem de classificação personalizada
Usando tipos categóricos
import pandas as pd
df = pd.DataFrame({
'priority': ['Medium', 'High', 'Low', 'High', 'Medium'],
'task': ['Task A', 'Task B', 'Task C', 'Task D', 'Task E']
})
# Definir ordem personalizada
priority_order = pd.CategoricalDtype(['Low', 'Medium', 'High'], ordered=True)
df['priority'] = df['priority'].astype(priority_order)
sorted_df = df.sort_values('priority')
print(sorted_df)
# priority task
# 2 Low Task C
# 0 Medium Task A
# 4 Medium Task E
# 1 High Task B
# 3 High Task DUsando o parâmetro key
import pandas as pd
df = pd.DataFrame({
'name': ['alice', 'Bob', 'CHARLIE', 'diana'],
'score': [85, 92, 78, 95]
})
# Ordenação sem distinção entre maiúsculas e minúsculas
sorted_df = df.sort_values('name', key=lambda x: x.str.lower())
print(sorted_df)
# name score
# 0 alice 85
# 1 Bob 92
# 2 CHARLIE 78
# 3 diana 95Comparação de métodos
| Método | Finalidade | Modifica o original? | Retorna |
|---|---|---|---|
sort_values(col) | Ordenar por valores da coluna | Não (exceto inplace=True) | DataFrame ordenado |
sort_values([col1, col2]) | Ordenar por múltiplas colunas | Não (exceto inplace=True) | DataFrame ordenado |
sort_index() | Ordenar por índice de linha | Não (exceto inplace=True) | DataFrame ordenado |
nsmallest(n, col) | Obter n menores valores | Não | Subconjunto de DataFrame |
nlargest(n, col) | Obter n maiores valores | Não | Subconjunto de DataFrame |
rank() | Atribuir classificações aos valores | Não | Series de classificações |
Dicas de desempenho
nlargest() e nsmallest() para Top-N
Quando você precisa apenas das primeiras ou últimas N linhas, nlargest() e nsmallest() são mais rápidos que ordenar todo o DataFrame:
import pandas as pd
import numpy as np
# DataFrame grande
df = pd.DataFrame({
'id': range(1_000_000),
'value': np.random.randn(1_000_000)
})
# Mais rápido: encontrar apenas o top 10
top_10 = df.nlargest(10, 'value')
# Mais lento: ordena tudo, depois fatia
top_10_slow = df.sort_values('value', ascending=False).head(10)Ordenação estável vs instável
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B'],
'value': [1, 1, 2, 2],
'order': [1, 2, 3, 4]
})
# Ordenação estável (padrão) preserva a ordem original para empates
stable = df.sort_values('value', kind='mergesort') # Padrão
# Ordenação instável (mais rápida para grandes conjuntos de dados)
unstable = df.sort_values('value', kind='quicksort')Exemplos práticos
Ordenar datas
import pandas as pd
df = pd.DataFrame({
'event': ['Launch', 'Meeting', 'Deadline', 'Review'],
'date': pd.to_datetime(['2026-03-15', '2026-01-10', '2026-02-28', '2026-01-05'])
})
# Ordem cronológica
print(df.sort_values('date'))
# event date
# 3 Review 2026-01-05
# 1 Meeting 2026-01-10
# 2 Deadline 2026-02-28
# 0 Launch 2026-03-15Ordenar com GroupBy
import pandas as pd
df = pd.DataFrame({
'store': ['A', 'A', 'B', 'B', 'A', 'B'],
'product': ['X', 'Y', 'X', 'Y', 'Z', 'Z'],
'revenue': [100, 250, 150, 300, 200, 175]
})
# Produto com maior receita por loja
top_per_store = (df.sort_values('revenue', ascending=False)
.groupby('store')
.head(1))
print(top_per_store)
# store product revenue
# 3 B Y 300
# 1 A Y 250Exploração visual de dados ordenados
Depois de ordenar seu DataFrame para encontrar padrões, PyGWalker (opens in a new tab) permite explorar os mesmos dados através de gráficos interativos de arrastar e soltar no Jupyter -- sem código adicional:
import pygwalker as pyg
walker = pyg.walk(sorted_df)Perguntas frequentes
Como ordeno um DataFrame por coluna no pandas?
Use df.sort_values('column_name') para ordem crescente ou df.sort_values('column_name', ascending=False) para decrescente. Para múltiplas colunas, passe uma lista: df.sort_values(['col1', 'col2']).
Como ordeno por múltiplas colunas com ordens diferentes?
Passe uma lista de booleanos para ascending: df.sort_values(['col1', 'col2'], ascending=[True, False]). Isso ordena col1 crescente e col2 decrescente.
Para onde vão os valores NaN ao ordenar?
Por padrão, os valores NaN são colocados no final independentemente da direção da ordenação. Use na_position='first' para colocá-los no início: df.sort_values('col', na_position='first').
Qual é a diferença entre sort_values e sort_index?
sort_values() ordena por valores da coluna. sort_index() ordena pelo índice da linha (ou índice da coluna com axis=1). Use sort_values para ordenar dados e sort_index quando precisar de linhas ordenadas pelos rótulos do índice.
Como ordeno um DataFrame no local sem criar uma cópia?
Passe inplace=True: df.sort_values('col', inplace=True). Isso modifica o DataFrame original e retorna None. Porém, o estilo moderno do pandas prefere a reatribuição: df = df.sort_values('col').
Conclusão
sort_values() é a ferramenta principal para ordenar DataFrames no pandas. Use um nome de coluna único para ordenações simples, uma lista para ordenações multicoluna e o parâmetro ascending para controlar a direção. Trate valores ausentes com na_position, use nlargest()/nsmallest() para consultas Top-N e CategoricalDtype para ordenações personalizadas. Lembre-se de que a ordenação retorna um novo DataFrame por padrão -- use reset_index(drop=True) se quiser um índice sequencial limpo depois.