in

python – Cambiar el nombre de las columnas en Pandas

apple touch icon@2

Me enfocaré en dos cosas:

  1. OP dice claramente

    Tengo los nombres de columna editados almacenados en una lista, pero no sé cómo reemplazar los nombres de columna.

    No quiero resolver el problema de cómo reemplazar '$' o elimine el primer carácter de cada encabezado de columna. OP ya ha realizado este paso. En cambio, quiero centrarme en reemplazar el existente columns objeto con uno nuevo dada una lista de nombres de columna de reemplazo.

  2. df.columns = new dónde new Esta lista de nombres de columnas nuevas es tan simple como parece. El inconveniente de este enfoque es que requiere editar el marco de datos existente. columns atributo y no se hace en línea. Mostraré algunas formas de realizar esto a través de la canalización sin editar el marco de datos existente.


Configuración 1
Para centrarme en la necesidad de cambiar el nombre de reemplazar los nombres de las columnas con una lista preexistente, crearé un nuevo marco de datos de muestra df con nombres de columna iniciales y nuevos nombres de columna no relacionados.

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

Solucion 1
pd.DataFrame.rename

Ya se ha dicho que si tenía un diccionario que asignaba los nombres de las columnas antiguas a los nombres de las nuevas columnas, podía usar pd.DataFrame.rename.

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

Sin embargo, puede crear fácilmente ese diccionario e incluirlo en la llamada a rename. Lo siguiente aprovecha el hecho de que al iterar sobre df, iteramos sobre cada nombre de columna.

# Given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Esto funciona muy bien si los nombres de sus columnas originales son únicos. Pero si no es así, entonces esto se rompe.


Configuración 2
Columnas no únicas

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

Solucion 2
pd.concat utilizando el keys argumento

Primero, observe lo que sucede cuando intentamos usar la solución 1:

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

No mapeamos el new lista como nombres de columna. Terminamos repitiendo y765. En su lugar, podemos usar el keys argumento de la pd.concat función mientras se itera a través de las columnas de df.

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

Solución 3
Reconstruir. Esto solo debe usarse si tiene un solo dtype para todas las columnas. De lo contrario, terminarás con dtype object para todas las columnas y volver a convertirlas requiere más trabajo de diccionario.

Soltero dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

Mezclado dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Solución 4
Este es un truco engañoso con transpose y set_index. pd.DataFrame.set_index nos permite establecer un índice en línea, pero no hay ningún set_columns. Entonces podemos transponer, entonces set_indexy transponer hacia atrás. Sin embargo, el mismo single dtype versus mixto dtype La salvedad de la solución 3 se aplica aquí.

Soltero dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

Mezclado dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Solución 5
Utilizar una lambda en pd.DataFrame.rename que recorre cada elemento de new.
En esta solución, pasamos una lambda que toma x pero luego lo ignora. También se necesita un y 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 de x es.

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Y como me lo señaló la gente de sopython chat, si agrego un * entre x y y, Puedo proteger mi y variable. Sin embargo, en este contexto, no creo que necesite protección. Todavía vale la pena mencionarlo.

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tutorial de secuencias de comandos de Shell

gfg 200x200 min

Cola en Python – GeeksforGeeks