Saltar al contenido

[2021] python – cambiar el nombre de las columnas en pandas {DH}

junio 19, 2022
apple touch icon@2

Me centraré en dos cosas:

  1. OP dice claramente

    Guardé los nombres de las columnas editadas en una lista, pero no sé cómo reemplazar los nombres de las columnas.

    No quiero resolver el problema del intercambio. '$' o elimine el primer carácter de cada encabezado de columna. OP ya ha hecho este paso. En su lugar, quiero centrarme en reemplazar lo que ya está allí columns objeto con un nuevo objeto que contiene una lista de nombres de columna de reemplazo.

  2. df.columns = new Dónde new Esta lista de nuevos nombres de columna es tan simple como parece. La desventaja de este enfoque es que se debe editar el marco de datos existente. columns atributo y no se hace en línea. Muestro algunas formas de hacer 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 y reemplazar los nombres de las columnas con una lista preexistente, creo 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

eso ya se ha dicho Tenía un diccionario que asignaba nombres de columnas antiguos a nombres de columnas nuevos que 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 un diccionario de este tipo e incluirlo en la llamada rename. Lo siguiente explota el hecho de que al iterar sobre dfiteramos 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 cuando los nombres de las columnas originales son únicos. Pero si no, entonces esto está roto.


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

solución 2
pd.concat Uso de keys Gráfico

Primero, observe lo que sucede cuando tratamos de 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 eso new list como nombres de columna. Al final repetimos y765. En su lugar, podemos usar el keys argumento de pd.concat Función al iterar 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 es soltero. dtype para todas las columnas. De lo contrario, terminas con dtype object para todas las columnas y volver a convertirlas requiere más trabajo de diccionario.

único 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 difícil de usar. transpose Y set_index. pd.DataFrame.set_index nos permite poner un índice en línea, pero no hay uno set_columns. Entonces podemos transponer set_indexy transponer de nuevo. Sin embargo, el mismo sencillo dtype mixto opuesto dtype La advertencia de la solución 3 se aplica aquí.

único 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

solucion 5
Utilizar una lambda en pd.DataFrame.rename que itera a través de cada elemento de new.
En esta solución pasamos una lambda que dura x entonces ignóralo. necesito uno también y pero no lo esperes. En cambio, se proporciona un iterador como valor predeterminado, y luego puedo usarlo para iterar uno a la vez, independientemente del 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 cuando la gente de sopython Chat cuando agrego uno * Adelante x Y ypuedo proteger el mio y Variable. En este contexto, sin embargo, no lo considero digno de protección. Todavía vale la pena mencionar.

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

   x098  y765  z432
0     1     3     5
1     2     4     6

. Contenido relacionado:

[2021] python – cambiar el nombre de las columnas en pandas {DH}