¿Cómo cambio el nombre de una columna específica en pandas?
Desde v0.24 +, para cambiar el nombre de una (o más) columnas a la vez,
Si necesita cambiar el nombre de TODAS las columnas a la vez,
DataFrame.set_axis()
método con axis=1
. Pase una secuencia similar a una lista. Las opciones también están disponibles para modificaciones en el lugar.
rename
con 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
Con 0.21+, ahora puede especificar un axis
parámetro con 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
(Tenga en cuenta que rename
no está en su lugar de forma predeterminada, por lo que deberá volver a asignar el resultado ).
Esta adición se ha realizado para mejorar la coherencia con el resto de la API. El nuevo axis
argumento es análogo al columns
parámetro: hacen lo mismo.
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
también acepta una devolución de llamada que se llama una vez para cada columna.
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 este escenario específico, desearía utilizar
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Similar al replace
método de cadenas en python, el índice y la serie pandas (solo tipo de objeto) definen un str.replace
método ("vectorizado") para el reemplazo basado en cadenas y expresiones regulares.
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
La ventaja de esto sobre los otros métodos es que str.replace
admite expresiones regulares (habilitado por defecto). Vea los documentos para más información.
Pasando una lista a set_axis
conaxis=1
Llame set_axis
con una lista de encabezado (s). La lista debe tener la misma longitud que el tamaño de las columnas / índice. set_axis
muta el DataFrame original de forma predeterminada, pero puede especificar inplace=False
que devuelva una copia 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: En futuras versiones, el inplace
valor predeterminado será True
.
Método de encadenamiento
¿Por qué elegir set_axis
cuando ya tenemos una manera eficiente de asignar columnas df.columns = ...
? Como lo muestra Ted Petrou en [esta respuesta], ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
es útil cuando se intentan encadenar 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()
La primera es una sintaxis más natural y de flujo libre.