Cambiar el nombre de una columna específica en pandas DataFrame


195

Estaba buscando una forma elegante de cambiar el nombre de una columna especificada en a 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 frase simple ... este intento falló ...

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

Cualquier pista recibida con gratitud.

Respuestas:


355

Existe un trazador de líneas:

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 del renamemétodo.

Definición: df.rename (self, index = None, columnas = None, copy = True, inplace = False)
Docstring:
Alterar el índice y / o las columnas con la función de entrada o
funciones Los valores de función / dict deben ser únicos (1 a 1). Etiquetas no
contenido en un dict / Series se dejará como está.

Parámetros
----------
índice: dict-like o función, opcional
    Transformación para aplicar a valores de índice
columnas: tipo dict o función, opcional
    Transformación para aplicar a valores de columna
copia: booleano, predeterminado verdadero
    Copie también los datos subyacentes.
en el lugar: booleano, falso predeterminado
    Si se debe devolver un nuevo DataFrame. Si es verdadero, el valor de la copia es
    ignorado

Ver también
--------
Series.rename

Devoluciones
-------
renombrado: DataFrame (nuevo objeto)

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

108

Como el inplaceargumento está disponible, no necesita copiar y asignar el marco de datos original a sí mismo, sino hacer lo siguiente:

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

39

¿Qué pasa?

df.columns.values[2] = "new_name"

11
en realidad eso no funciona si luego usa el nombre de la columna en otras operaciones como en df ['new_name']
Master Yogurt

44
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 columna originales de antemano ... mientras que este es un método rápido y sucio ... que tiene sus propios usos.
ihightower

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

1
Dicho esto, usar los renamemétodos es una mejor solución.
Jacob H

6

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 ({'two': 'new_name'}, axis = 'columnas') Emite TypeError: No se puede especificar tanto 'axis' como ninguno de 'index' o 'columnas'.
HereHere

@HereHere Asegúrese de estar en la versión 0.21 de pandas. Haga pd.__version__para verificar su versión
Ted Petrou

5

Si sabe qué columna # es (primero / segundo / enésimo), esta solución publicada en una pregunta similar funciona independientemente de si está nombrada 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..)

3

Para cambiar el nombre de las columnas aquí es simple, que funcionará tanto para Default(0,1,2,etc;)las columnas existentes como para las existentes, pero no es muy útil para un conjunto de datos más grande (que tiene 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']

2

El siguiente código corto puede ayudar:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Eliminar espacios de columnas.


Seguí recibiendo, ¿ AttributeError: 'int' object has no attribute 'replace'podrías ampliar eso?
Nirmal

2

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 reemplazar tiene un argumento inesperado 'columnas'


1

Otra opción sería simplemente copiar y soltar la columna:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

Después de eso obtienes el resultado:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5

2
Este método no ayudará en caso de que el orden de los índices de las columnas sea importante. La nueva columna se creará al final.
Loochie
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.