tablas renombrar para one nombre libreria leer index funciones datos columns columnas columna column cambiar python pandas assign columnname

python - renombrar - rename columns pandas



pandas asigna con nuevo nombre de columna como cadena (2)

Recientemente descubrí el método de "asignación" de pandas que me parece muy elegante. Mi problema es que el nombre de la nueva columna se asigna como palabra clave, por lo que no puede contener espacios o guiones.

df = DataFrame({''A'': range(1, 11), ''B'': np.random.randn(10)}) df.assign(ln_A = lambda x: np.log(x.A)) A B ln_A 0 1 0.426905 0.000000 1 2 -0.780949 0.693147 2 3 -0.418711 1.098612 3 4 -0.269708 1.386294 4 5 -0.274002 1.609438 5 6 -0.500792 1.791759 6 7 1.649697 1.945910 7 8 -1.495604 2.079442 8 9 0.549296 2.197225 9 10 -0.758542 2.302585

pero ¿qué pasa si quiero nombrar la nueva columna "ln (A)" por ejemplo? P.ej

df.assign(ln(A) = lambda x: np.log(x.A)) df.assign("ln(A)" = lambda x: np.log(x.A)) File "<ipython-input-7-de0da86dce68>", line 1 df.assign(ln(A) = lambda x: np.log(x.A)) SyntaxError: keyword can''t be an expression

Sé que podría cambiar el nombre de la columna justo después de la llamada .assign, pero quiero entender más sobre este método y su sintaxis.


Puede pasar los argumentos de palabras clave para assign como un diccionario, así:

kwargs = {"ln(A)" : lambda x: np.log(x.A)} df.assign(**kwargs) A B ln(A) 0 1 0.500033 0.000000 1 2 -0.392229 0.693147 2 3 0.385512 1.098612 3 4 -0.029816 1.386294 4 5 -2.386748 1.609438 5 6 -1.828487 1.791759 6 7 0.096117 1.945910 7 8 -2.867469 2.079442 8 9 -0.731787 2.197225 9 10 -0.686110 2.302585


assign espera un montón de argumentos de palabras clave. A su vez, asignará columnas con los nombres de las palabras clave. Eso es útil, pero no puedes pasar una expresión como la palabra clave. Esto lo explica @EdChum en los comentarios con este docs.python.org/3.2/reference/lexical_analysis.html#identifiers

utilizar insert lugar de transformación inplace

df.insert(2, ''ln(A)'', np.log(df.A)) df

usa concat si no quieres in situ

pd.concat([df, np.log(df.A).rename(''log(A)'')], axis=1)