Como renomear uma coluna específica nos pandas?
Da v0.24 +, para renomear uma (ou mais) colunas por vez,
Se você precisar renomear TODAS as colunas de uma só vez,
DataFrame.set_axis()
método com axis=1
. Passe uma sequência tipo lista. As opções também estão disponíveis para modificação no local.
rename
com axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Com 0,21+, agora você pode especificar um axis
parâmetro com rename
:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(Observe que rename
não está no local por padrão, você precisará atribuir o resultado novamente .)
Essa adição foi feita para melhorar a consistência com o restante da API. O novo axis
argumento é análogo ao columns
parâmetro - eles fazem a mesma coisa.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
também aceita um retorno de chamada chamado uma vez para cada coluna.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Para esse cenário específico, você deseja usar
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Semelhante ao replace
método de seqüências de caracteres em python, o pandas Index and Series (apenas no tipo de objeto) define um str.replace
método ("vetorizado") para a substituição baseada em expressões e regex.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
A vantagem disso sobre os outros métodos é que str.replace
suporta regex (ativado por padrão). Veja os documentos para mais informações.
Passando uma lista para set_axis
comaxis=1
Ligue set_axis
com uma lista de cabeçalho (s). A lista deve ter comprimento igual ao tamanho das colunas / índice. set_axis
modifica o DataFrame original por padrão, mas você pode especificar inplace=False
para retornar uma cópia modificada.
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Nota: Em versões futuras, inplace
o padrão será True
.
Encadeamento de métodos
Por que escolher set_axis
quando já temos uma maneira eficiente de atribuir colunas df.columns = ...
? Conforme mostrado por Ted Petrou em [esta resposta], ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
é útil ao tentar encadear métodos.
Comparar
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Versus
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
O primeiro é uma sintaxe mais natural e de fluxo livre.