4
respostas

indices numericos

https://cursos.alura.com.br/forum/topico-pequeno-erro-na-alternativa-correta-219891

Na discussão acima, é dito que "se analisarmos o exercício podemos perceber que a variável dados é um dicionário e, assim como uma lista, o primeiro item de qualquer dicionário possui índice = 0 que é o caso da chave "Motor". Entretanto, tenho duas questões a colocar: 1) Ok, que a variável dados é um dicionário, mas quando eu faço "dataset = pd.DataFrame(dados, index = ['Jetta', 'Passat', 'Crossfox', 'DS5', 'Fusca'])", eu deixo de ter um dicionario e passo a ter um dataframe chamado dataset 2) Quando foi feito index = ['Jetta', 'Passat', 'Crossfox', 'DS5', 'Fusca'] em dataset, o índice númerico não passou a ser substituido pelo indice de nomes dos carros, ou seja, o indice numerico deixou de existir?

Assim, como é possivel q o iloc retorne algum valor, se ele trabalha apenas com indice numerico do dataframe?

4 respostas

Olá, Rogério! Tudo bem com você?

Você está correto na afirmação de que após executar o código dataset = pd.DataFrame(dados, index = ['Jetta', 'Passat', 'Crossfox', 'DS5', 'Fusca']) a variável dataset passou a ser um Pandas DataFrame. E podemos comprovar isso executando o seguinte comando:

type(dataset)

Saída:

pandas.core.frame.DataFrame

Em relação a sua segunda dúvida, quando fazemos essa atribuição de indexação não estamos substituindo os indices inteiros por esses nomes, estamos criando outra alternativa de acesso. Por exemplo, se você atribuísse a cada elemento um indice único ficaria mais fácil você o fazer acesso a um elemento em específico que deduzir qual seria seu indice inteiro. Então ao fazermos essa atribuição é possível fazer o acesso com o loc para os nomes dados e com o iloc pela indexação de inteiros.

Qualquer dúvida estou à disposição. Bons estudos.

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

Então, na prática, eu acabo tendo dois indices? O que eu acabei de atribuir, com index = ['Jetta', 'Passat', 'Crossfox', 'DS5', 'Fusca'] e o índice padrão do pandas? (0,1,2...),

E qual seria a vantagem de eu atribuir um indice a um dataframe? Por exemplo, um que se repete (já que a repetição de indices é possivel).

Olá Rogério.

Sim. Na prática você acaba tendo as duas formas de fazer acesso, porém com métodos distintos. O iloc você usa para fazer acesso com índices inteiros, enquanto o loc você faz acesso com os índices nomeados. Caso você não tivesse nomeado não seria possível a utilização do método loc.

A vantagem de possuir indices repetidos vai depender de cada contexto. Criei um pequeno exemplo abaixo para ilustrar isso:

import pandas as pd

idx = pd.Index(['Labrador', 'Beagle', 'Labrador', 
                      'Lhasa', 'Husky', 'Beagle'])
dog = pd.DataFrame({'Nome': ['joao', 'pedro', 'maria', 'jose', 'marcos', 'jose']},
                   index = idx)

dog

Saída:

Nome
Labradorjoao
Beaglepedro
Labradormaria
Lhasajose
Huskymarcos
Beaglejose

Onde o índice refere-se a raça do cachorro e a coluna nome refere-se ao nome que o cachorro possui (não consegui pensar em nomes melhores para cachorros).

Agora vamos supor que queremos somente os cachorros que sejam da raça Labrador:

dog.loc['Labrador']

Saída:

Nome
Labradorjoao
Labradormaria

Com esses índices repetidos e nomeados podemos fazer essa query de forma mais simples que usando por exemplo o iloc que teríamos que utilizar de indices inteiros ou de uma lógica mais complexa. Então as vantagens dependem de cada caso.

Os índices inteiros não deixam de existir. Somente é criada outra possibilidade de acesso ao indices do DataFrame.

Qualquer dúvida que tenha ficado ainda estou à disposição.

Acho que entendi. Considere o seguinte exemplo:

dic_func = {
    'Nome': ['Hey', 'Pedro', 'Marta'],
    'Idade': [2.78999282832, 0, 0],
    'Pai': ['G Kasparov', 'Sergey Bubka', 'Sotto Mayor']
}

df_func = pd.DataFrame(dic_func, index=['Maria Shriver', 'Murrieta', 'Roberta Myoushi'])

Então, isso funciona (o índice "padrão" do Pandas continua lá, mesmo eu tendo criado outra possibilidade de index)

df_func[1:3]`

E isso também funciona (outra possibilidade de indexar as consultas que criei):

df_func['Murrieta':'Roberta Myoushi']

Ambos retornam os mesmos resultados.

Está correta a afirmação acima?

Mas uma dúvida que ainda persiste. Por que eu faria uma coluna com indices (no caso, a raça do cachorro), ao invés de ter essa propria coluna , como uma series igual às outras, no meu dataframe?