Converter linha em cabeçalho de coluna para Pandas DataFrame,
111
Os dados com os quais tenho que trabalhar são um pouco confusos. Tem nomes de cabeçalho dentro de seus dados. Como posso escolher uma linha de um dataframe existente do pandas e torná-lo (renomeá-lo para) um cabeçalho de coluna?
In[21]: df = pd.DataFrame([(1,2,3),('foo','bar','baz'),(4,5,6)])In[22]: df
Out[22]:01201231 foo bar baz
2456
Defina os rótulos das colunas para serem iguais aos valores na 2ª linha (localização do índice 1):
In[23]: df.columns = df.iloc[1]
Se o índice tiver rótulos exclusivos, você pode descartar a 2ª linha usando:
In[24]: df.drop(df.index[1])Out[24]:1 foo bar baz
01232456
Se o índice não for único, você pode usar:
In[133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]Out[133]:1 foo bar baz
01232456
Usar df.drop(df.index[1])remove todas as linhas com o mesmo rótulo da segunda linha. Como os índices não exclusivos podem levar a obstáculos (ou possíveis bugs) como esse, geralmente é melhor cuidar para que o índice seja exclusivo (mesmo que o Pandas não exija isso).
Muito obrigado por sua resposta rápida! Como posso escolher uma linha por valor em vez da localização do índice para torná-lo cabeçalho? Então, para o seu exemplo, algo como .. df.columns = df [df [0] == 'foo']
EK
O problema com isso é que pode haver mais de uma linha com o valor "foo". Uma maneira de contornar esse problema é escolher explicitamente o primeiro tal consecutivas: df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]].
unutbu 01 de
Ah, entendo porque você fez assim. No meu caso, sei que existe apenas uma linha com o valor "foo". Então está tudo bem. Acabei de fazer isso, acho que é o mesmo que você me deu acima. idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.columns = df.iloc [idx_loc]
"foo"
. Uma maneira de contornar esse problema é escolher explicitamente o primeiro tal consecutivas:df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]]
.Isso funciona (pandas v'0.19.2 '):
fonte
.drop(df.index[0])
Seria mais fácil recriar o quadro de dados. Isso também interpretaria os tipos de colunas do zero.
fonte
Você pode especificar o índice da linha nos construtores read_csv ou read_html por meio do
header
parâmetro que representaRow number(s) to use as the column names, and the start of the data
. Isso tem a vantagem de eliminar automaticamente todas as linhas anteriores que supostamente são inúteis.fonte