[ad_1]
Me centraré en dos cosas:
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.df.columns = new
Dóndenew
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 1pd.DataFrame.rename
eso ya se ha dicho Sí 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 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 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 2pd.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_index
y 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 su lugar, se proporciona un iterador como valor predeterminado y luego puedo usarlo para iterar uno tras otro, 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 charla sí…
[ad_2]
[2021] python – cambiar el nombre de las columnas en pandas {DH}
Sin comentarios