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:
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 :)