Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida usando [1:]

Notei nessa aula que, ao utilizar 'range', por exemplo o código baixo:

dataset.iloc[1:4]

O retorno é em formato DataFrame mesmo utilizando apenas um par de colchetes [ ] , diferente de quando selecionamos items específicos que requerem o duplo colchete [[ ]]:

dataset.iloc[1]
dataset.iloc[[1]]

Também notei que ao tentar usar mais de um item com apenas um par de colchetes [ ] tenho diferentes resultados:

  • Usando 2 itens, obtenho um número o qual não entendo o resultado:
dataset.iloc[1, 2]
>> 
5712.0
  • Usando 3 ou mais números, obtenho o erro:
dataset.iloc[1, 2, 3]
>>
---------------------------------------------------------------------------

IndexingError                             Traceback (most recent call last)

<ipython-input-49-9e3bd352d59e> in <module>
----> 1 dataset.iloc[1, 2, 3]

3 frames

/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py in _validate_key_length(self, key)
    790     def _validate_key_length(self, key: Sequence[Any]) -> None:
    791         if len(key) > self.ndim:
--> 792             raise IndexingError("Too many indexers")
    793 
    794     def _getitem_tuple_same_dim(self, tup: tuple):

IndexingError: Too many indexers

Com relação a seleção de range 'automaticamente' gerar um DataFrace, acredito que o Panda 'entende' que temos uma range com múltiplos item, ou bidimencional e automaticamente gera o DataFrame, porém não compreendo os cenários acima.

3 respostas

Olá, João Paulo! Tudo bom? Espero que sim!

Internamente, o Pandas conhece o tamanho total do DataFrame, então ele pode determinar todos os elementos com o iloc mesmo utilizando apenas o [1:].

Quando você utiliza a expressão dataset.iloc[1, 2], você está informando ao Pandas para acessar a linha de índice 1, e a coluna de índice 2. Então ele retorna um valor. Você pode alcançar o mesmo resultado usando dataset.iloc[1][2].

Mas como o formato do DataFrame é bidimensional, ou seja, um aspecto tabular, trabalhamos apenas com linhas e colunas, e não existe uma terceira dimensão para acessar os valores com dataset.iloc[1, 2, 3], por isso o erro.

E também existem outras notações, exemplo:

dataset.iloc[1:4, 4:6]

Que seleciona as linhas de índice 1, 2, 3, e as colunas de índice 4 e 5, sempre exclusivo a direita.

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Marcus, agradeço pela resposta.

Relendo minha dúvida, vejo que não me expressei 100% corretamente.

Referente a primeira pergunta, minha maior dúvida é que, ao usar o dataset.iloc[1] com apenas um par de chaves, o resultado é em Series, porém ao usar ao usar dataset.iloc[1:4] o resultado retorna DataFrame sem a necessidade utilizar chaves duplas. Qual o motivo dessa diferença nos resultados, em um cenário precisamos de chaves duplas para retornar como DataFrame porém apenas 1 no outro? Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Para a segunda dúvida, ficou claro o pq precisamos seria no máximo 2 itens, porém, quando utilizamos linhas e colunas dentro de chaves duplas, podemos utilizar mais posições, como no exemplo da aula, correto? Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Por fim, gostaria de entender o resultado 5712.0 visto aqui. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Sobre a primeira pergunta, quando é especificado apenas o iloc[0], este entende como apenas uma linha selecionada, que no Pandas, é entendida como uma Series. Já o iloc[[0]] já trabalha com a ideia de que está sendo passada uma lista de linhas, mesmo que seja apenas um elemento, mas de toda maneira, agora o Pandas já formata a saída do código como DataFrame. E como isso também é útil para determinadas aplicações que precisam de métodos de DataFrame, é conveniente que exista essas duas possibilidades. Da mesma maneira, o iloc[1:4] também entende que são mais de uma linha, então o resultado também é um DataFrame.

Uma Series no Pandas é uma única linha ou única coluna. Um Series pode ser transformada em um DataFrame, mas um DataFrame é um conjunto de uma ou mais Series.

Na segunda pergunta, você está especificando novamente uma lista de linhas que você deseja buscar, e dessas listas de linhas, você seleciona apenas algumas colunas, passando a lista de índices das colunas que você está buscando.

Por fim, no último caso, quando você especifica iloc[1, 2], você está acessando a linha de índice 1, e a coluna de índice 2, ou seja, um valor da tabela do DataFrame nessas posições. Que é diferente do iloc[[1, 2]], onde é passada apenas uma lista de linhas, e retornará um DataFrame.