terça-feira, 11 de agosto de 2020

Seleção de subconjuntos de dados

Photo by Thanos Pal on Unsplash

Introdução

As dimensões de uma série ou dataframe tem seu rotulo no objeto index. O objeto index é usado para separar as estruturas do pandas. São os indexs que rotulam cada linha e coluna, com isso podemos selecionar os dados do dataframe. A biblioteca pandas também permite selecionar dados de acordo com a posição das colunas e linhas. Podendo selecionar dados por nome ou números (posição), a biblioteca pandas fornece uma sintaxe poderosa. O que acaba torna a seleção de subconjuntos um pouco confusa.
Já vimos exemplos de seleção de dados por rótulo e posição. A lista e o dicionário do python fazem isso. Esse é um dos motivos da biblioteca pandas ser poderosa. Juntando a capacidade de acessar dados por rótulo (dicionário) e posição (lista) temos um tipo de dado muito versátil.

Seleção de dados da série com pandas

As séries e os dataframes pandas funcionam como contêiner de dados. Esses contêineres têm métodos e atributos que nos permitem selecionar os dados de várias maneiras. Os métodos e atributos fazer operações com índices para selecionar os dados. Também podemos usar os atributos iloc e loc.
Podemos selecionar dados informando a posição ou um rótulo. Usando o atributo iloc selecionamos os dados por posição, fazendo um objeto do pandas parecer com uma lista. Já usando o atributo loc, selecionamos os dados informando um rótulo, como um dicionário do python.
Esses dois atributos estão presentes nas séries e nos dataframes. Nesse tutorial vamos aprender a selecionar dados utilizando rótulos e posições. Os dois atributos aceitam valores escalares e listas.
Colocando colchetes depois de uma variável estamos fazendo uma operação de índice. Não faz diferença se é uma seleção com rótulo ou posição, tudo é operação de índice.
Você obter o dataset usado nesse tutorial aqui.

Selecionando dados utilizando rótulo e posição

Vamos carregar o dataset na memoria e selecionar uma coluna usando uma operação de index. Nesse primeiro exemplo vamos usar o rótulo da coluna.

>>> import pandas as pd
>>> animelist = pd.read_csv(‘animelist.csv’)
>>> animelist['title']
0                                Inu x Boku SS
1                             Seto no Hanayome
2                           Shugo Chara!! Doki
3                                Princess Tutu
4                          Bakuman. 3rd Season
                         ...                  
14473               Gutchonpa Omoshiro Hanashi
14474                     Geba Geba Shou Time!
14475              Godzilla: Hoshi wo Kuu Mono
14476    Nippon Mukashibanashi: Sannen Netarou
14477               Senjou no Valkyria Special
Name: title, Length: 14478, dtype: object

Podemos ter o mesmo resultado com o atributo loc.

>>> animelist.loc[:, 'title']
0                                Inu x Boku SS
1                             Seto no Hanayome
2                           Shugo Chara!! Doki
3                                Princess Tutu
4                          Bakuman. 3rd Season
                         ...                  
14473               Gutchonpa Omoshiro Hanashi
14474                     Geba Geba Shou Time!
14475              Godzilla: Hoshi wo Kuu Mono
14476    Nippon Mukashibanashi: Sannen Netarou
14477               Senjou no Valkyria Special
Name: title, Length: 14478, dtype: object

Com o atributo loc podemos selecionar linhas e colunas passando o rótulo do índice. Se apenas um valor for passado o atributo vai retornar uma linha com os dados de cada coluna. Se passamos dois valores podemos selecionar as linhas e as colunas, e ainda podemos definir o espaçamento.

# selecionando uma linha
# passamos um número inteiro porque o índice é de inteiros e não strings
>>> animelist.loc[12]
anime_id                                                      11123
title                                          Sekaiichi Hatsukoi 2
title_english     Sekai Ichi Hatsukoi - World's Greatest Fi...
title_japanese                                              世界一初恋 2
title_synonyms    Sekai-ichi Hatsukoi 2, Sekai'ichi Hatsukoi 2
image_url         https://myanimelist.cdn-dena.com/images/anime/...
type                                                             TV
source                                                        Manga
episodes                                                         12
status                                              Finished Airing
airing                                                        False
aired_string                            Oct 8, 2011 to Dec 24, 2011
aired                    {'from': '2011-10-08', 'to': '2011-12-24'}
duration                                            24 min. per ep.
rating                                    PG-13 - Teens 13 or older
score                                                          8.23
scored_by                                                     53285
rank                                                            288
popularity                                                      945
members                                                       89543
favorites                                                       726
background        An event to show ep.1 of season 2 (along with ...
premiered                                                 Fall 2011
broadcast                                                   Unknown
related           {'Adaptation': [{'mal_id': 10309, 'type': 'man...
producer                   Lantis, Kadokawa Shoten, AT-X, KlockWorx
licensor                                                 Funimation
studio                                                  Studio Deen
genre                            Comedy, Drama, Romance, Shounen Ai
opening_theme     ['"Sekai no Hate ni Kimi ga Itemo" (世界の果てに君がいて...
ending_theme             ['"Aikotoba" (アイコトバ) by Sakura Merry-Men']
Name: 12, dtype: object

>>> animelist.loc[12:32, 'title':'rank']
                     title  ...    rank
12    Sekaiichi Hatsukoi 2  ...   288.0
13  Tonari no Kaibutsu-kun  ...  1093.0
14                  Bleach  ...   693.0
15                 Chobits  ...  1546.0
16          Kimi ni Todoke  ...   400.0
17      Naruto: Shippuuden  ...   337.0
18                 Ranma ½  ...   802.0
19               Toradora!  ...   174.0
20     Bakuman. 2nd Season  ...   108.0
21            Gakuen Alice  ...   941.0
22              Skip Beat!  ...   282.0
23           Chihayafuru 2  ...   116.0
24        Shounen Onmyouji  ...  1158.0
25             Chihayafuru  ...   246.0
26         Itazura na Kiss  ...  1108.0
27               Beelzebub  ...   528.0
28   Hanasakeru Seishounen  ...   753.0
29              SKET Dance  ...   213.0
30            B-gata H-kei  ...  3193.0
31        Crayon Shin-chan  ...  1032.0
32           Fruits Basket  ...   939.0

[21 rows x 17 columns]

No ultimo exemplo selecionamos linhas e colunas. Selecionamos os dados da linha numero doze até a linha trinta e dois. As colunas, selecionamos da coluna title até a coluna rank. O atributo iloc funciona do mesmo modo, a diferença é que esse atributo não aceita rótulos. O atributo iloc só aceita posições.

>>> animelist.iloc[12:32, 1:17]
                     title  ... scored_by
12    Sekaiichi Hatsukoi 2  ...     53285
13  Tonari no Kaibutsu-kun  ...    281448
14                  Bleach  ...    433097
15                 Chobits  ...    175388
16          Kimi ni Todoke  ...    212710
17      Naruto: Shippuuden  ...    385179
18                 Ranma ½  ...     59911
19               Toradora!  ...    557898
20     Bakuman. 2nd Season  ...    122090
21            Gakuen Alice  ...     33244
22              Skip Beat!  ...     90699
23           Chihayafuru 2  ...     62720
24        Shounen Onmyouji  ...     14619
25             Chihayafuru  ...     89081
26         Itazura na Kiss  ...     91187
27               Beelzebub  ...    136105
28   Hanasakeru Seishounen  ...     16772
29              SKET Dance  ...     44132
30            B-gata H-kei  ...    142827
31        Crayon Shin-chan  ...     17683

[20 rows x 16 columns]

Para selecionar, do primeiro elemento até um determinado, é só omitir a posição ou rótulo de inicio. Por exemplo: animelist.iloc[:32, 1:17]. Se você quiser definir o inicio e selecionar até o ultimo elemento é só omitir a posição ou rotulo do último elemento: animelist.loc[12:, ‘rank’:].

Referência:
Atributo loc
Atributo iloc

0 comentários:

Postar um comentário