Cambiar un nombre de columna específico en pandas DataFrame [duplicate]

4 minutos de lectura

avatar de usuario
Gráfico de marcas

Estaba buscando una forma elegante de cambiar un nombre de columna específico en un DataFrame.

reproducir datos…

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

La solución más elegante que he encontrado hasta ahora…

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

Esperaba una simple frase ingeniosa… este intento falló…

df.columns[df.columns.tolist().index('one')] = 'another_name'

Cualquier sugerencia recibida con gratitud.

Existe una sola línea:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

A continuación se muestra la cadena de documentación para el rename método.

Definition: df.rename(self, index=None, columns=None, copy=True, inplace=False)
Docstring:
Alter index and / or columns using input function or
functions. Function / dict values must be unique (1-to-1). Labels not
contained in a dict / Series will be left as-is.

Parameters
----------
index : dict-like or function, optional
    Transformation to apply to index values
columns : dict-like or function, optional
    Transformation to apply to column values
copy : boolean, default True
    Also copy underlying data
inplace : boolean, default False
    Whether to return a new DataFrame. If True then value of copy is
    ignored.

See also
--------
Series.rename

Returns
-------
renamed : DataFrame (new object)

  • Esto no funciona para mí a menos que use inplace=True como se muestra en la respuesta de @Jeong-Yoon Lee.

    – JStrahl

    19 de marzo de 2020 a las 8:55

avatar de usuario
Jeong Yoon Lee

Ya que inplace argumento está disponible, no necesita copiar y asignar el marco de datos original a sí mismo, pero haga lo siguiente:

df.rename(columns={'two':'new_name'}, inplace=True)

avatar de usuario
jacob h

¿Qué pasa?

df.columns[2] = "new_name"

  • en realidad eso no funciona si luego usa el nombre de la columna en otras operaciones como en df[‘new_name’]

    – Maestro Yogurt

    4 de julio de 2016 a las 16:46

  • esta respuesta me fue útil para cambiar una columna específica a un nuevo nombre. La primera columna es el índice 0, la segunda columna es el índice 1, y así sucesivamente. buena solución … y estoy seguro de que esto ayudará a más personas … ya que las otras soluciones requieren que conozca y copie los nombres de las columnas originales de antemano … mientras que este es un método rápido y sucio … que tiene sus propios usos.

    – ihightower

    30/09/2017 a las 17:27


  • @MasterYogurt tu comentario no es correcto. Es posible realizar df['new_name'] (y otras cosas de pandas) después de cambiar las variables como se describe anteriormente. Su comentario puede haber sido válido cuando se publicó originalmente.

    – Jacob H.

    29/09/2018 a las 21:12


  • Dicho esto, usando el rename métodos es una mejor solución.

    – Jacob H.

    29/09/2018 a las 21:13

  • @JacobH Todavía me encuentro con este problema con Pandas v1.0.3

    – Felipe

    20 oct 2020 a las 14:08

Si sabe qué columna # es (primera / segunda / enésima), entonces esta solución publicada en una pregunta similar funciona independientemente de si tiene nombre o no, y en una línea: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)

Pandas 0.21 ahora tiene un parámetro de eje

El método de cambio de nombre ha ganado un parámetro de eje para que coincida con la mayoría del resto de la API de pandas.

Entonces, además de esto:

df.rename(columns = {'two':'new_name'})

Tu puedes hacer:

df.rename({'two':'new_name'}, axis=1)

o

df.rename({'two':'new_name'}, axis="columns")

  • df.rename({‘dos’:’nuevo_nombre’}, eje=’columnas’) Lanza TypeError: no se puede especificar tanto el ‘eje’ como cualquiera de los ‘índices’ o ‘columnas’.

    – Aquí Aquí

    30 de diciembre de 2017 a las 23:37


  • @HereHere Asegúrate de estar en la versión 0.21 de pandas. Hacer pd.__version__ para comprobar su versión

    –Ted Petrou

    30 de diciembre de 2017 a las 23:49

avatar de usuario
aylen

Para cambiar el nombre de las columnas aquí está el simple que funcionará para ambos Default(0,1,2,etc;) y columnas existentes, pero no muy útiles para conjuntos de datos más grandes (que tienen muchas columnas).

Para un conjunto de datos más grande, podemos dividir las columnas que necesitamos y aplicar el siguiente código:

df.columns = ['new_name','new_name1','old_name']

  • df.rename({‘dos’:’nuevo_nombre’}, eje=’columnas’) Lanza TypeError: no se puede especificar tanto el ‘eje’ como cualquiera de los ‘índices’ o ‘columnas’.

    – Aquí Aquí

    30 de diciembre de 2017 a las 23:37


  • @HereHere Asegúrate de estar en la versión 0.21 de pandas. Hacer pd.__version__ para comprobar su versión

    –Ted Petrou

    30 de diciembre de 2017 a las 23:49

avatar de usuario
Malakai

pandas versión 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Para el registro:

omitir index=str dará error replace tiene un argumento inesperado ‘columns’

  • Esto se extiende muy bien para más de una columna: si tiene una lista de los old_names y el new-names (uno por uno), entonces puedes hacer: df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

    – Colín

    3 de septiembre de 2021 a las 8:58


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad