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 A
donde 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
.columns
atributo:fuente
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.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=1
yinplace=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 1000code
trabajos 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=True
es necesario para evitar ese gotchya.El
rename
mé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_Name
lugar 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.
rename
método ha agregado elaxis
parámetro que se puede establecer encolumns
o1
. Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene elindex
ycolumns
parámetros pero ya no estás obligado a usarlos.set_axis
método con elinplace
conjunto para leFalse
permite 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
rename
conaxis='columns'
oaxis=1
o
Ambos resultan en lo siguiente:
Todavía es posible usar la firma del método anterior:
La
rename
función también acepta funciones que se aplicarán a cada nombre de columna.o
Usando
set_axis
con una lista yinplace=False
Puede proporcionar una lista al
set_axis
método que tenga la misma longitud que el número de columnas (o índice). Actualmente, el valorinplace
predeterminado esTrue
, peroinplace
será predeterminadoFalse
en 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_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 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_names
lo 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.values
para obtener los nombres antiguos.myList = list(df) myList[10:20]
etc., así que esto es perfecto.namez = df.columns.values
seguido 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 elcolumns
objeto existente con uno nuevo dada una lista de nombres de columnas de reemplazo.df.columns = new
dondenew
está la lista de nuevos nombres de columnas es tan simple como parece. El inconveniente de este enfoque es que requiere editar elcolumns
atributo 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
df
con nombres de columnas iniciales y nombres de columnas nuevos no relacionados.Solución 1
pd.DataFrame.rename
Ya 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.concat
usando elkeys
argumentoPrimero, observe lo que sucede cuando intentamos usar la solución 1:
No mapeamos la
new
lista como los nombres de las columnas. Terminamos repitiendoy765
. En cambio, podemos usar elkeys
argumento de lapd.concat
función mientras iteramos a través de las columnas dedf
.Solución 3
Reconstruir. Esto solo debe usarse si tiene un solo
dtype
para todas las columnas. De lo contrario, terminará condtype
object
todas las columnas y convertirlas de nuevo requiere más trabajo de diccionario.Soltero
dtype
Mezclado
dtype
Solución 4
Este es un truco ingenioso con
transpose
yset_index
.pd.DataFrame.set_index
nos 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 simpledtype
versus mixtadtype
de la solución 3 se aplica aquí.Soltero
dtype
Mezclado
dtype
Solución 5
Use a
lambda
enpd.DataFrame.rename
ese ciclo a través de cada elemento denew
En esta solución, pasamos una lambda que toma
x
pero luego la ignora. También toma uny
pero 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
*
intermediox
yy
puedo proteger miy
variable. 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)
x
se 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.array
numpy.array
s tiene una propiedad.name
Este 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.columns
atributo es unlist
cuando, de hecho, es unSeries
. Esto significa que tiene un.name
atributo.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
.name
atributo persiste a veces. Si establece,df.columns = ['one', 'two']
entoncesdf.one.name
será'one'
.Si se establece
df.one.name = 'three'
a continuación,df.columns
todavía le dará['one', 'two']
, ydf.one.name
le dará'three'
PERO
pd.DataFrame(df.one)
volveráPorque los pandas reutilizan los
.name
de 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
strip
mé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.slice
para 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
names
yheader=0
para 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