2
respostas

Ajuda para transformar uma tabela de um site em um dataframe

Caros,

praticando o aprendido na aula criei um notebook para importar uma tabela de um site e com isso criar um dataframe e fazer algumas seleções nos dados.

Porém estou encontrando o seguinte erro: ValueError: Must pass 2-d input. shape=(1, 342, 7)

Sei que está faltando algo no código, mas não consegui entender o que. Por favor peço ajuda.

Código:

df_html = pd.read_html('http://www.ita.br/noticias349')
columns = ['Qtde','Candidatos','Programa','Área','Curso','Militar','Nan']
df = pd.DataFrame(df_html, columns = columns)
df
2 respostas

Respondendo a mim mesma, acabei conseguindo da seguinte forma:

df_html = pd.read_html('http://www.ita.br/noticias349')
df = pd.DataFrame(data=df_html[0])
df.columns = df.iloc[0]
df.drop(0, inplace=True)
df

Boa noite, Claudia. Tudo bem? Não sei se entendi exatamente o seu problema e vi que já conseguiu resolver, mas gostaria de dizer como que eu faria só para colocar um segundo ponto de vista.

Podemos fazer esse código de várias formas:

Ao invés de utilizar 2 variáveis para o DataFrame podemos ir reatribuindo as alterações na mesma, a menos que queira manter a tabela original guardada. Para criar o DataFrame não precisamos necessariamente usar o pd.DataFrame(data=df), mas simplesmente colocar a indexação 0 que o pandas faz isso automaticamente: df_html[0].

Com relação a renomear as colunas ao invés de uma lista precisamos passar um dicionário como parâmetro, onde a chave é o nome que está na coluna atualmente e o valor sendo o nome que queremos que fique: {'nome_atual': 'nome_desejado'}, desse modo ele faz a substituição dos nomes das colunas respectivamente. Caso tenha feito o df a partir da indexação, podemos renomear a partir do df.rename(columns = {dict}, inplace=True) ou df.rename(columns = variável_com_dict, inplace=True). Inplace para sobrescrever o df ao invés de apenas exibir como ficaria. Ou então podemos fazer como na sua resposta e atribuir a primeira linha do df como o nome das colunas.

Para remover a primeira linha podemos usar o drop() ou então reatribuir o df a partir da segunda linha: df_html = df_html[1:], tendo o mesmo resultado. O problema de ambos é que a indexação das linhas fica errada começando a partir do 1. Para consertar podemos fazer um range() para a quantidade de linhas, ou seja, o shape[0]: df_html.index = range(df_html.shape[0]).

Vou deixar os códigos abaixo pra exemplicar melhor os jeitos que fiz:

import pandas as pd
df_html = pd.read_html('http://www.ita.br/noticias349')
df = df_html[0]
columns = {0: 'Qtde', 1: 'Candidatos', 2: 'Programa', 3: 'Área', 4: 'Curso', 5: 'Militar', 6: 'Nan'}
df.rename(columns = columns, inplace=True)
df = df[1:]
df.index = range(df.shape[0])
df
import pandas as pd
df = pd.read_html('http://www.ita.br/noticias349')
df = df[0]
df.columns = df.iloc[0]
df = df[1:]
df.index = range(df.shape[0])
df
import pandas as pd
df = pd.read_html('http://www.ita.br/noticias349')[0]
df.columns = df.iloc[0]
df = df[1:]
df.index = range(df.shape[0])
df

Em todos os casos o resultado final é esse: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Espero que tenha ajudado um pouco ou pelo mostrando um ponto de vista diferente. Se tiver ficado confuso ou deixado alguma dúvida, por favor me avise que tentarei explicar melhor :)