Ordenar e pegar os maiores

Reordenar as linhas por uma ou mais colunas e ficar com os primeiros.
Operações com pandasOperações com pandasAula 1 Aula 3 Aula 11← voltar ao mapa
Na prova · extra Útil para explorar, mas raramente é o que a questão pede. Guia da prova

Os códigos desta página rodam no navegador, mas não sozinhos: clique em Run Code em cada bloco, de cima para baixo.

DicaEm uma frase

dados.sort_values(by='coluna') reordena as linhas pelos valores da coluna (crescente por padrão; decrescente com ascending=False), e .head(n) fica com as n primeiras. Para ordenar pelo índice, como uma tabela de frequências de 0, 1, 2, …, use .sort_index().

A ideia

A base WorldBank.xlsx vem em ordem alfabética de país. Para responder “quais são os países mais populosos?”, precisamos mudar a ordem das linhas segundo uma variável. Foi o primeiro problema da Aula 1, e ele tem uma lição que vale para quase todo o pandas: sort_values não altera a base original, ele devolve uma nova tabela. Se você não guardar o resultado em uma variável, a ordenação se perde.

O argumento by diz por qual coluna ordenar; sem ele, o pandas não sabe o que fazer e reclama. Com uma lista, by=['region', 'Population'], ordena pela primeira coluna e desempata pela segunda.

Há um segundo tipo de ordenação que aparece muito na parte de probabilidade: .value_counts() ordena a tabela da categoria mais frequente para a menos frequente. Para uma variável discreta, como o número de itens em não conformidade na vistoria do Detran (Aula 11), queremos a ordem dos valores 0, 1, 2, … Isso é ordenar pelo índice, com .sort_index(). É assim que a tabela de frequências fica pronta para ser comparada com uma distribuição de probabilidade.

No código

Tuvalu, Palau e Ilhas Marshall são os menos populosos. Mas a base continua em ordem alfabética, porque o resultado não foi guardado:

Agora sim: China, Índia, Estados Unidos, Indonésia e Brasil. Dá para encadear os passos em uma linha só, lendo da esquerda para a direita. Os parênteses por fora permitem quebrar a linha, um passo em cada linha:

Com duas colunas: região em ordem alfabética e, dentro de cada região, do mais populoso para o menos populoso.

E a ordenação pelo índice, com a vistoria do Detran da Aula 11:

A primeira tabela começa pelo 1 (o valor mais frequente); a segunda segue 0, 1, 2, 3, que é a ordem que faz sentido para comparar com o modelo binomial.

Armadilhas comuns

  • Esquecer o by. sort_values() sem dizer a coluna dá missing 1 required positional argument: 'by'.
  • Achar que a base mudou. dados.sort_values(...) sozinho não altera dados. Guarde: ordenados = dados.sort_values(...).
  • Esquecer o ascending=False. Para “os maiores”, a ordem precisa ser decrescente; senão você pega os menores.
  • Trocar a ordem de head e sort_values. dados.head(5).sort_values(...) ordena só as 5 primeiras linhas da base. Primeiro ordene, depois corte.
  • value_counts fora de ordem. Para variável discreta, use .sort_index(). Para qualitativa ordinal (satisfação, escolaridade), defina a ordem com pd.Categorical e use sort=False (veja Categorias e ordem).

Para “os 5 maiores”, o pandas tem um atalho: dados.nlargest(5, 'Population') faz o mesmo que ordenar de forma decrescente e pegar o head(5). Nas aulas usamos sort_values + head porque deixa cada passo visível.

Exercícios aqui na página

Complete os ______ e clique em Run Code: a correção aparece logo abaixo. Use Show Hint para uma dica e Show Solution para ver uma resolução. O Python roda no seu navegador; na primeira vez ele leva alguns segundos para carregar.

Exercício 1

Guarde em top3 uma lista com os nomes dos 3 países de maior área (surface), do maior para o menor.

O padrão do sort_values é do menor para o maior.

top3 = paises.sort_values(by='surface', ascending=False).head(3)['Country'].tolist()
top3

Exercício 2

Faça a tabela de frequências relativas de SibSp (irmãos ou cônjuges a bordo) ordenada pelo valor 0, 1, 2, … É o formato que vira distribuição de probabilidade na Aula 8.

value_counts ordena pela frequência; os valores estão no índice.

fr_sibsp = titanic['SibSp'].value_counts(normalize=True).sort_index()
fr_sibsp

Exercício 3

Qual é a região do país mais populoso? Rode a primeira linha e escreva o nome da região exatamente como aparece na base.

Copie o texto da coluna region, com o sublinhado.

print(paises.sort_values(by='Population', ascending=False).head(1)[['Country', 'region']])
regiao = paises.sort_values(by='Population', ascending=False).iloc[0]['region']
regiao

Comandos e documentação oficial

formulário o comando está no formulário que você pode consultar na prova.

Pratique

As listas novas de revisão abrem no Google Colab (use Arquivo → Salvar uma cópia no Drive). As listas das aulas estão no Blackboard, na pasta de cada aula.