terça-feira, 11 de agosto de 2020

Agrupando e ordenando com pandas

Photo by UX Indonesia on Unsplash

O agrupamento e a classificação de dados é uma das tarefas mais básicas durante a análise de dados. É comum selecionar linhas que tenham o maior valor dentro de uma coluna e classificar esses valores em grupos. Por exemplo, se você precisar saber qual foi o filme de 2016 com maior audiência ou qual é a classificação de filme que arrecada mais com bilheteria, isso seria feito classificando os grupos. Primeiro é preciso separar os filmes por ano e depois selecionar os filmes com maior bilheteria.
Nesse tutorial, vamos descobrir qual é o anime com o maior rank entre os animes com os scores mais altos.

Como agrupar e ordenar com pandas

Primeiro vamos carregar o dataset e selecionar as colunas que nos interessa: title, rank e score. O dataset que vamos utilizar pode ser baixado aqui.

>>> import pandas as pd
>>> animelist = pd.read_csv('animelist.csv')
>>> animelist = animelist[['title', 'score', 'rank']]
>>> animelist
                                       title  score     rank
0                              Inu x Boku SS   7.63   1274.0
1                           Seto no Hanayome   7.89    727.0
2                         Shugo Chara!! Doki   7.55   1508.0
3                              Princess Tutu   8.21    307.0
4                        Bakuman. 3rd Season   8.67     50.0
...                                      ...    ...      ...
14473             Gutchonpa Omoshiro Hanashi   5.50  10337.0
14474                   Geba Geba Shou Time!   4.60  10236.0
14475            Godzilla: Hoshi wo Kuu Mono   0.00      NaN
14476  Nippon Mukashibanashi: Sannen Netarou   6.00  11557.0
14477             Senjou no Valkyria Special   5.15  12056.0

[14478 rows x 3 columns]

Vamos utilizar o método sort_values() para ordenar o dataframe por score. Esse método vai ordenar todo o dataframe começando do menor para o maior. Assim as primeiras linhas serão os animes com os menores score. Para inverter isso passamos o valor False para o parâmetro ascending.

>>> animelist.sort_values(by='score', ascending=False)
                                                   title  score     rank
14407                                         Ittekimasu  10.00  10657.0
14317  Kuunyan no Koutsuu Anzen: Tadashii Jitensha no...  10.00  11071.0
548    Manichi ga Tsurai Kimochi Wakarimasu ka: Yurus...  10.00  11178.0
14467               Kyouiku Eiga-sai Jushou Anime Series  10.00  11091.0
14403                            Dokidoki Little Ooyasan   9.52      NaN
...                                                  ...    ...      ...
6557                                 Asagao to Kase-san.   0.00      NaN
6614                              Boogiepop wa Warawanai   0.00      NaN
14067                             BanG Dream! 2nd Season   0.00      0.0
12964                       Katsugeki/Touken Ranbu Movie   0.00      NaN
12039                           Moshimoshi, Terumi Desu.   0.00      NaN

[14478 rows x 3 columns]

No exemplo acima, os dados foram ordenados de acordo com o score, do maior para o menor. Para ordenar várias colunas, vamos usar uma lista com os nomes das colunas que queremos ordenar.

>>> animelist.sort_values(by=['score', 'rank'], ascending=False)
    title  score     rank
548    Manichi ga Tsurai Kimochi Wakarimasu ka: Yurus...  10.00  11178.0
14467               Kyouiku Eiga-sai Jushou Anime Series  10.00  11091.0
14317  Kuunyan no Koutsuu Anzen: Tadashii Jitensha no...  10.00  11071.0
14407                                         Ittekimasu  10.00  10657.0
14403                            Dokidoki Little Ooyasan   9.52      NaN
...                                                  ...    ...      ...
14414                             Shinya! Tensai Bakabon   0.00      NaN
14416                          Chikyuugai Shounen Shoujo   0.00      NaN
14417                           Uchuu no Hou: Reimei-hen   0.00      NaN
14463                                          Space Bug   0.00      NaN
14475                        Godzilla: Hoshi wo Kuu Mono   0.00      NaN

[14478 rows x 3 columns]

Note que as duas colunas foram ordenadas do maior para o menor. A biblioteca pandas seleciona o score mais alto e depois seleciona os ranks mais altos com o mesmo score. Desse modo, agrupamos os animes de acordo com o score e o rank. Assim obtemos a informação de que o anime com maior rank, entre os animes que tem o maior score, é o Manichi ga Tsurai. Podemos obter um par score/rank dos maiores valores de cada score diferente chamando o método drop_duplicates().

>>> (
... animelist.sort_values(by=['score', 'rank'], ascending=False)
... .drop_duplicates(subset='score')
... )
                                                   title  score     rank
548    Manichi ga Tsurai Kimochi Wakarimasu ka: Yurus...  10.00  11178.0
14403                            Dokidoki Little Ooyasan   9.52      NaN
14454           Tat-chan - Momo-chan no Fushigina Taiken   9.50  12430.0
2555                    Fullmetal Alchemist: Brotherhood   9.25      1.0
3129                                   Okaachan Gomen ne   9.20  11595.0
...                                                  ...    ...      ...
12844                                         Dragon Egg   1.50  10028.0
14420      Cofun Gal no Coffy (TV): Christmas Daisakusen   1.33   9959.0
14393                          Atashi Tenshi Anata Akuma   1.25   9712.0
13955                                         Woo to Wah   1.00  12678.0
14425                        Wo Shi Jiang Xiaobai (2018)   0.00  12719.0

[630 rows x 3 columns]

Por padrão, o método drop_duplicates() pega o primeiro valor. Podemos mudar esse comportamento passando o valor 'last' para o parâmetro keep.

>>> (
... animelist.sort_values(by=['score', 'rank'], ascending=False)
... .drop_duplicates(subset='score', keep='last')
... )
                                               title  score     rank
14407                                     Ittekimasu  10.00  10657.0
14403                        Dokidoki Little Ooyasan   9.52      NaN
14208                                   Hashire John   9.50  10357.0
2555                Fullmetal Alchemist: Brotherhood   9.25      1.0
3129                               Okaachan Gomen ne   9.20  11595.0
...                                              ...    ...      ...
12844                                     Dragon Egg   1.50  10028.0
14420  Cofun Gal no Coffy (TV): Christmas Daisakusen   1.33   9959.0
14393                      Atashi Tenshi Anata Akuma   1.25   9712.0
14187                               Gomen ne Chitchi   1.00  10256.0
14475                    Godzilla: Hoshi wo Kuu Mono   0.00      NaN

[630 rows x 3 columns]

Referência:
Método sort_values()

0 comentários:

Postar um comentário