In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])
In [22]: df
Out[22]:
0 1 2
0 1 2 3
1 foo bar baz
2 4 5 6
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
0 1 2 3
2 4 5 6
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
0 1 2 3
2 4 5 6
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).