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 columna en un DataFrame Adonde están los nombres de columna originales:
['$a', '$b', '$c', '$d', '$e']
a
['a', 'b', 'c', 'd', 'e'].
Tengo los nombres de columna editados almacenados en una lista, pero no sé cómo reemplazar los nombres de columna.

Respuestas:
Simplemente asígnelo al
.columnsatributo:fuente
new_columns = df.columns.values;new_columns[0] = 'XX';df.columns = new_columnsdf.rename(columns = {'$b':'B'}, inplace = True)RENOMBRAR COLUMNAS ESPECÍFICAS
Use la
df.rename()función y refiera las columnas a renombrar. No todas las columnas deben ser renombradas:Ejemplo de código mínimo
Los siguientes métodos funcionan y producen el mismo resultado:
Recuerde asignar el resultado nuevamente, ya que la modificación no está en su lugar. Alternativamente, especifique
inplace=True:Desde v0.25, también puede especificar
errors='raise'generar errores si se especifica una columna para cambiar el nombre no válida. Ver v0.25rename()documentos .REASIGNAR CABEZALES DE COLUMNA
Use
df.set_axis()conaxis=1yinplace=False(para devolver una copia).Esto devuelve una copia, pero puede modificar el DataFrame in situ configurando
inplace=True(este es el comportamiento predeterminado para las versiones <= 0.24, pero es probable que cambie en el futuro).También puede asignar encabezados directamente:
fuente
code<clase 'pandas.core.frame.DataFrame'> Int64Index: 1000 entradas, 0 a 999 columnas de datos: BodyMarkdown 1000codetrabajos no nulos , pero cuando hago dataframe.head (), los nombres antiguos de las columnas vuelven a aparecer.SettingWithCopyWarning:cuando uso el segundo fragmento de código en esta respuesta.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})cambia el nombre que se muestra, pero no los elementos en la estructura de datos subyacente. Entonces, si lo intentasdf['newName1'], obtendrás un error. Elinplace=Truees necesario para evitar ese gotchya.El
renamemétodo puede tomar una función , por ejemplo:fuente
df.rename(columns=lambda x: x.lstrip(), inplace=True)t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)es una joya para que podamos escribir endf.Column_1_Namelugar de escribirdf.loc[:, 'Column 1 Name'].Como se documenta en Trabajar con datos de texto :
fuente
Pandas 0.21+ Respuesta
Ha habido algunas actualizaciones significativas para cambiar el nombre de la columna en la versión 0.21.
renamemétodo ha agregado elaxisparámetro que se puede establecer encolumnso1. Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene elindexycolumnsparámetros pero ya no estás obligado a usarlos.set_axismétodo con elinplaceconjunto para leFalsepermite cambiar el nombre de todas las etiquetas de índice o columna con una lista.Ejemplos para Pandas 0.21+
Construya el DataFrame de muestra:
Utilizando
renameconaxis='columns'oaxis=1o
Ambos resultan en lo siguiente:
Todavía es posible usar la firma del método anterior:
La
renamefunción también acepta funciones que se aplicarán a cada nombre de columna.o
Usando
set_axiscon una lista yinplace=FalsePuede proporcionar una lista al
set_axismétodo que tenga la misma longitud que el número de columnas (o índice). Actualmente, el valorinplacepredeterminado esTrue, peroinplaceserá predeterminadoFalseen versiones futuras.o
¿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_axises 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 en otra variable antes de reasignar las columnas.fuente
Pandas 0.21+ answer- de alguna manera me perdí esa parte en la parte de "lo nuevo" ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )Como solo desea eliminar el signo $ en todos los nombres de columna, puede hacer lo siguiente:
O
fuente
Reemplazará los nombres existentes con los nombres que proporcione, en el orden que proporcione.
fuente
df.columns.values, eso está mal. stackoverflow.com/questions/43291781/…De esta manera, puede editar manualmente
new_nameslo que desee. Funciona muy bien cuando necesita cambiar el nombre de unas pocas columnas para corregir errores ortográficos, acentos, eliminar caracteres especiales, etc.fuente
df.columns = ['a', 'b', 'c', 'd', 'e']es más simple.df.columns.valuespara obtener los nombres antiguos.myList = list(df) myList[10:20]etc., así que esto es perfecto.namez = df.columns.valuesseguido de algunas modificacionesdf.columns = namez.Soluciones de una línea o tubería
Me enfocaré en dos cosas:
OP establece claramente
No quiero resolver el problema de cómo reemplazar
'$'o quitar el primer carácter de cada encabezado de columna. OP ya ha hecho este paso. En cambio, quiero centrarme en reemplazar elcolumnsobjeto existente con uno nuevo dada una lista de nombres de columnas de reemplazo.df.columns = newdondenewestá la lista de nuevos nombres de columnas es tan simple como parece. El inconveniente de este enfoque es que requiere editar elcolumnsatributo del marco de datos existente y no se hace en línea. Mostraré algunas formas de realizar esto mediante la canalización sin editar el marco de datos existente.Configuración 1
Para centrarnos en la necesidad de cambiar el nombre de los nombres de las columnas de reemplazo por una lista preexistente, crearé un nuevo marco de datos de muestra
dfcon nombres de columnas iniciales y nombres de columnas nuevos no relacionados.Solución 1
pd.DataFrame.renameYa se ha dicho que si tuviera un diccionario que asignara los nombres de las columnas antiguas a los nuevos, podría usarlo
pd.DataFrame.rename.Sin embargo, puede crear fácilmente ese diccionario e incluirlo en la llamada a
rename. Lo siguiente aprovecha el hecho de que cuando iteramosdf, iteramos sobre cada nombre de columna.Esto funciona muy bien si los nombres de columna originales son únicos. Pero si no lo son, entonces esto se rompe.
Configurar 2
columnas no únicas
Solución 2
pd.concatusando elkeysargumentoPrimero, observe lo que sucede cuando intentamos usar la solución 1:
No mapeamos la
newlista como los nombres de las columnas. Terminamos repitiendoy765. En cambio, podemos usar elkeysargumento de lapd.concatfunción mientras iteramos a través de las columnas dedf.Solución 3
Reconstruir. Esto solo debe usarse si tiene un solo
dtypepara todas las columnas. De lo contrario, terminará condtypeobjecttodas las columnas y convertirlas de nuevo requiere más trabajo de diccionario.Soltero
dtypeMezclado
dtypeSolución 4
Este es un truco ingenioso con
transposeyset_index.pd.DataFrame.set_indexnos permite establecer un índice en línea pero no hay correspondencia correspondienteset_columns. Entonces podemos transponer, entoncesset_index, y volver a transponer. Sin embargo, la misma advertencia simpledtypeversus mixtadtypede la solución 3 se aplica aquí.Soltero
dtypeMezclado
dtypeSolución 5
Use a
lambdaenpd.DataFrame.renameese ciclo a través de cada elemento denewEn esta solución, pasamos una lambda que toma
xpero luego la ignora. También toma unypero no lo espera. En cambio, se proporciona un iterador como valor predeterminado y luego puedo usarlo para recorrer uno a la vez sin tener en cuenta cuál es el valor dex.Y como me señaló la gente en el chat de sopython , si agrego un
*intermedioxyypuedo proteger miyvariable. Sin embargo, en este contexto, no creo que necesite protección. Todavía vale la pena mencionarlo.fuente
df.rename(lambda x : x.lstrip('$'),axis=1)xse ignora?Nombres de columna versus nombres de series
Me gustaría explicar un poco lo que sucede detrás de escena.
Los marcos de datos son un conjunto de series.
Las series a su vez son una extensión de un
numpy.arraynumpy.arrays tiene una propiedad.nameEste es el nombre de la serie. Rara vez los pandas respetan este atributo, pero persiste en algunos lugares y puede usarse para piratear algunos comportamientos de los pandas.
Nombrar la lista de columnas
Muchas respuestas aquí hablan de que el
df.columnsatributo es unlistcuando, de hecho, es unSeries. Esto significa que tiene un.nameatributo.Esto es lo que sucede si decide completar el nombre de las columnas
Series:Tenga en cuenta que el nombre del índice siempre viene una columna más abajo.
Artefactos que permanecen
El
.nameatributo persiste a veces. Si establece,df.columns = ['one', 'two']entoncesdf.one.nameserá'one'.Si se establece
df.one.name = 'three'a continuación,df.columnstodavía le dará['one', 'two'], ydf.one.namele dará'three'PERO
pd.DataFrame(df.one)volveráPorque los pandas reutilizan los
.namede lo ya definidoSeries.Nombres de columna de niveles múltiples
Pandas tiene formas de hacer nombres de columnas de varias capas. No hay tanta magia involucrada, pero también quería cubrir esto en mi respuesta, ya que no veo a nadie entendiendo esto aquí.
Esto se puede lograr fácilmente configurando columnas en listas, como esta:
fuente
Si tiene el marco de datos, df.columns volca todo en una lista que puede manipular y luego reasignar en su marco de datos como los nombres de las columnas ...
¿Mejor manera? NO SÉ. Un camino, sí.
A continuación se muestra una mejor manera de evaluar todas las técnicas principales presentadas en las respuestas a la pregunta utilizando cProfile para medir la memoria y el tiempo de ejecución. @kadee, @kaitlyn y @eumiro tenían las funciones con los tiempos de ejecución más rápidos, aunque estas funciones son tan rápidas que estamos comparando el redondeo de .000 y .001 segundos para todas las respuestas. Moraleja: mi respuesta anterior probablemente no sea la mejor manera.
fuente
Digamos que este es su marco de datos.
Puede cambiar el nombre de las columnas con dos métodos.
Utilizando
dataframe.columns=[#list]La limitación de este método es que si se debe cambiar una columna, se debe pasar la lista completa de columnas. Además, este método no es aplicable en las etiquetas de índice. Por ejemplo, si pasó esto:
Esto arrojará un error. Longitud no coincidente: el eje esperado tiene 5 elementos, los nuevos valores tienen 4 elementos.
Otro método es el
rename()método Pandas , que se utiliza para cambiar el nombre de cualquier índice, columna o fila.Del mismo modo, puede cambiar cualquier fila o columna.
fuente
Si su nueva lista de columnas está en el mismo orden que las columnas existentes, la asignación es simple:
Si tuviera un diccionario tecleado en los nombres de columnas antiguas a los nombres de columnas nuevas, podría hacer lo siguiente:
Si no tiene una lista o un mapeo de diccionario, puede quitar el
$símbolo inicial a través de una comprensión de la lista:fuente
lambda col: d[col]que pudieras pasard.get... así seríadf.columns.map(d.get)https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
fuente
Comprendamos el cambio de nombre con un pequeño ejemplo ...
1. Renombrar columnas usando mapeo:
2. Cambiar el nombre del índice / Row_Name usando la asignación:
fuente
Otra forma en que podríamos reemplazar las etiquetas de columna originales es quitando los caracteres no deseados (aquí '$') de las etiquetas de columna originales.
Esto podría haberse hecho ejecutando un bucle for sobre df.columns y agregando las columnas despojadas a df.columns.
En cambio, podemos hacer esto ordenadamente en una sola declaración usando la comprensión de la lista como a continuación:
(El
stripmétodo en Python elimina el carácter dado desde el principio y el final de la cadena).fuente
Realmente simple solo use
y asignará los nombres de columna por el orden en que los colocó
fuente
Podrías usar
str.slicepara eso:fuente
df.columns.str[1:]... probablemente mejor usar eso, es más corto y más obvio.Sé que esta pregunta y respuesta han sido masticadas hasta la muerte. Pero me referí a él como inspiración para uno de los problemas que estaba teniendo. Pude resolverlo usando fragmentos de diferentes respuestas, por lo tanto, proporcioné mi respuesta en caso de que alguien la necesite.
Mi método es genérico en el que puede agregar delimitadores adicionales separando la
delimiters=variable de la coma y preparándolo para el futuro.Código de trabajo
Salida:
fuente
Tenga en cuenta que este enfoque no funciona para un MultiIndex. Para un MultiIndex, debe hacer algo como lo siguiente:
fuente
Otra opción es renombrar usando una expresión regular:
fuente
Si tiene que lidiar con un montón de columnas nombradas por el sistema proveedor fuera de su control, se me ocurrió el siguiente enfoque que es una combinación de un enfoque general y reemplazos específicos de una sola vez.
Primero cree un diccionario a partir de los nombres de columna del marco de datos utilizando expresiones de expresiones regulares para descartar ciertos apéndices de nombres de columna y luego agregue reemplazos específicos al diccionario para nombrar columnas centrales como se espera más adelante en la base de datos receptora.
Esto se aplica al marco de datos de una vez.
fuente
Además de la solución ya proporcionada, puede reemplazar todas las columnas mientras lee el archivo. Podemos usar
namesyheader=0para hacer eso.Primero, creamos una lista de los nombres que nos gusta usar como nuestros nombres de columna:
En este caso, todos los nombres de columna serán reemplazados por los nombres que tiene en su lista.
fuente
Aquí hay una pequeña función ingeniosa que me gusta usar para reducir la escritura:
Aquí hay un ejemplo de cómo funciona:
fuente
Renombrar columnas en pandas es una tarea fácil.
fuente
Asumiendo que puedes usar expresiones regulares. Esta solución elimina la necesidad de codificación manual utilizando expresiones regulares.
fuente