Renombrar columnas específicas en pandas

Tengo un marco de data llamado data . ¿Cómo puedo cambiar el nombre del único encabezado de una columna? Por ejemplo gdp to log(gdp) ?

 data = y gdp cap 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7 

 data.rename(columns={'gdp':'log(gdp)'}, inplace=True) 

El rename muestra que acepta un dict como parámetro para columns por lo que simplemente pasa un dict con una sola entrada.

También ver relacionados

Una implementación mucho más rápida sería utilizar list-comprehension si necesita cambiar el nombre de una sola columna.

 df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns] 

Si surge la necesidad de cambiar el nombre de varias columnas, use expresiones condicionales como:

 df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns] 

O bien, construya una asignación utilizando un dictionary y realice la list-comprehension la list-comprehension con su operación de get configurando el valor predeterminado como el nombre antiguo:

 col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name df.columns = [col_dict.get(x, x) for x in df.columns] 

Tiempos:

 %%timeit df.rename(columns={'gdp':'log(gdp)'}, inplace=True) 10000 loops, best of 3: 168 µs per loop %%timeit df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns] 10000 loops, best of 3: 58.5 µs per loop 

¿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,

  • DataFrame.rename() con axis=1 o axis='columns' (el argumento del axis se introdujo en v0.21 .

  • Index.str.replace() para reemplazo basado en cadena / Index.str.replace() regulares.

Si necesita cambiar el nombre de TODAS las columnas a la vez,

  • DataFrame.set_axis() con axis=1 . Pase una secuencia similar a una lista. Las opciones están disponibles para la modificación en el lugar también.

rename con axis=1

 df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5)) df y gdp cap 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

Con 0.21+, ahora puede especificar un parámetro de axis con rename :

 df.rename({'gdp':'log(gdp)'}, axis=1) # df.rename({'gdp':'log(gdp)'}, axis='columns') y log(gdp) cap 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

(Tenga en cuenta que el rename no está en el lugar de forma predeterminada, por lo que deberá volver a asignar el resultado ).

Esta adición se ha hecho para mejorar la consistencia con el rest de la API. El nuevo argumento de axis es análogo al parámetro de columns : hacen lo mismo.

 df.rename(columns={'gdp': 'log(gdp)'}) y log(gdp) cap 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

rename también acepta una callback que se llama una vez para cada columna.

 df.rename(lambda x: x[0], axis=1) # df.rename(lambda x: x[0], axis='columns') ygc 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

Para este escenario específico, querría utilizar

 df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1) 

Index.str.replace

Similar al método de replace de cadenas en python, el índice y la serie de pandas (solo el tipo de objeto) definen un método str.replace (“vectorizado”) para la cadena y el reemplazo basado en str.replace regulares.

 df.columns = df.columns.str.replace('gdp', 'log(gdp)') df y log(gdp) cap 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

La ventaja de esto sobre los otros métodos es que str.replace compatible con str.replace regulares (habilitada de forma predeterminada). Consulte la documentación para obtener más información.


Pasando una lista a set_axis con axis=1

Llame a set_axis con una lista de encabezados. La lista debe ser igual en longitud a las columnas / tamaño del índice. set_axis muta el DataFrame original de manera predeterminada, pero puede especificar inplace=False para devolver 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 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

Nota: En futuras versiones, inplace se establecerá de forma predeterminada en True .

Método de encadenamiento
¿Por qué elegir set_axis cuando ya tenemos una forma eficiente de asignar columnas con df.columns = ... ? Como lo demostró Ted Petrou en [esta respuesta], ( https://stackoverflow.com/a/46912050/4909087 ) set_axis es útil cuando se intenta 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 syntax más natural y fluida.