Pregunta Renombrar columnas en pandas


Tengo un DataFrame que usa pandas y etiquetas de columna que necesito editar para reemplazar las etiquetas de columna originales.

Me gustaría cambiar los nombres de las columnas en un DataFrame A donde los nombres de las columnas originales son:

['$a', '$b', '$c', '$d', '$e'] 

a

['a', 'b', 'c', 'd', 'e'].

Tengo los nombres de las columnas editadas almacenados en una lista, pero no sé cómo reemplazar los nombres de las columnas.


1080
2017-07-05 14:21


origen


Respuestas:


Simplemente asignes a la .columns atributo:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

1117
2017-07-05 14:23



Utilizar el df.rename() función y remita las columnas a cambiar de nombre. No todas las columnas tienen que renombrarse:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

1859
2017-07-06 01:48



los rename método puede tomar una función, por ejemplo:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

293
2018-05-21 09:58



Como se documenta en http://pandas.pydata.org/pandas-docs/stable/text.html:

df.columns = df.columns.str.replace('$','')

119
2018-05-30 13:24



Como solo desea eliminar el signo $ en todos los nombres de columna, puede hacer lo siguiente:

df = df.rename(columns=lambda x: x.replace('$', ''))

O

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

115
2018-03-26 10:20



Pandas 0.21+ respuesta

Hubo algunas actualizaciones significativas al cambio de nombre de columna en la versión 0.21.

  • los rename método ha agregado el axis parámetro que se puede configurar para columns o 1. Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene el index y columns parámetros pero ya no está obligado a usarlos.
  • los set_axis método con el inplace ajustado a False le permite cambiar el nombre de todas las etiquetas de índice o columna con una lista.

Ejemplos para Pandas 0.21+

Construir marco de datos de muestra:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

Utilizando rename con axis='columns' o axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

o

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

Ambos resultan en lo siguiente:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

Todavía es posible usar la antigua firma de método:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

los rename la función también acepta funciones que se aplicarán a cada nombre de columna.

df.rename(lambda x: x[1:], axis='columns')

o

df.rename(lambda x: x[1:], axis=1)

Utilizando set_axis con una lista y inplace=False

Puede suministrar una lista al set_axis método que es igual en longitud al número de columnas (o índice). Actualmente, inplace predeterminado a True, pero inplace será predeterminado para False en lanzamientos futuros.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

o

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

Por qué no usar df.columns = ['a', 'b', 'c', 'd', 'e']?

No hay nada de malo en asignar columnas directamente como esta. Es una solución perfectamente buena.

La ventaja de usar set_axis es que se puede usar como parte de una cadena de métodos y que devuelve una nueva copia del DataFrame. Sin él, tendría que almacenar sus pasos intermedios de la cadena a otra variable antes de reasignar las columnas.

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

90
2017-10-24 13:39



df.columns = ['a', 'b', 'c', 'd', 'e']

Reemplazará los nombres existentes con los nombres que proporcione, en el orden que proporcione.

También puede asignarlos por índice de esta manera:

df.columns.values[2] = 'c'    #renames the 2nd column to 'c' (in position #3)

66
2018-03-22 08:59



old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

De esta forma puede editar manualmente new_names como desées. Funciona muy bien cuando solo necesita cambiar el nombre de algunas columnas para corregir errores ortográficos, acentos, eliminar caracteres especiales, etc.


52
2018-05-21 17:48