renombrar nombre filtrar datos data columnas columna cambiar agregar python pandas dataframe rename

python - nombre - filtrar datos pandas



Cambie el nombre de un encabezado de columna individual en un marco de datos de pandas (3)

Pandas 0.21+ respuesta

Hubo algunas actualizaciones significativas al cambio de nombre de columna en la versión 0.21.

  • El método de rename ha agregado el parámetro de axis que se puede establecer en columns o 1 . Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene los parámetros de index y columns , pero ya no está obligado a usarlos.
  • El método set_index con inplace establecido en False permite cambiar el nombre de todas las etiquetas de índice o columna con una lista.

Ejemplos para Pandas 0.21+

Construir marco de datos de muestra:

df = pd.DataFrame({''y'':[1,2,8], ''gdp'':[2,3,7], ''cap'':[5,9,2]}, columns=[''y'',''gdp'', ''cap'']) cap gdp y 0 5 2 1 1 9 3 2 2 2 7 8

Usando rename con axis=''columns'' o axis=1 (nuevo para 0.21)

df.rename({''gdp'':''log(gdp)''}, axis=''columns'')

o

df.rename({''gdp'':''log(gdp)''}, axis=1)

Ambos resultan en lo siguiente:

cap log(gdp) y 0 5 2 1 1 9 3 2 2 2 7 8

Todavía es posible usar la antigua firma de método:

df.rename(columns={''gdp'':''log(gdp)''})

La función de rename también acepta funciones que se aplicarán a cada nombre de columna.

df.rename(lambda x: ''log(gdp)'' if x == ''gdp'' else x, axis=''columns'')

o

df.rename(lambda x: ''log(gdp)'' if x == ''gdp'' else x, axis=1)

Usar set_axis con una lista y inplace=False

Puede proporcionar una lista para el método set_axis que tiene la misma longitud que el número de columnas (o índice). Actualmente, inplace en True , pero inplace se establecerá como False en versiones futuras.

df.set_axis([''cap'', ''log(gdp)'', ''y''], axis=''columns'', inplace=False)

o

df.set_axis([''cap'', ''log(gdp)'', ''y''], axis=1, inplace=False)

¿Por qué no usar df.columns = [''cap'', ''log(gdp)'', ''y''] ?

No hay nada de malo en asignar columnas directamente como esta. Es una solución perfectamente buena.

La ventaja de utilizar set_axis es que puede usarse 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 a otra variable antes de reasignar las columnas.

# new for pandas 0.21+ df.some_method1() .some_method2() .set_axis() .some_method3() # old way df1 = df.some_method1() .some_method2() df1.columns = columns df1.some_method3()

Tengo un dataframe llamado data . ¿Cómo cambiaría el nombre del único encabezado de columna? Por ejemplo, gdp to log(gdp) ?

data = y gdp cap 0 1 2 5 1 2 3 9 2 8 7 2 3 3 4 7 4 6 7 7 5 4 8 3 6 8 2 8 7 9 9 10 8 6 6 4 9 10 10 7


Una implementación mucho más rápida sería usar la list-comprehension si necesita cambiar el nombre de una sola columna.

df.columns = [''log(gdp)'' if x==''gdp'' else x for x in df.columns]

Si surge la necesidad de cambiar el nombre de varias columnas, utilice expresiones condicionales como:

df.columns = [''log(gdp)'' if x==''gdp'' else ''cap_mod'' if x==''cap'' else x for x in df.columns]

O bien, construya un mapeo usando un dictionary y realice la list-comprehension la list-comprehension con su operación de get estableciendo el valor predeterminado como el nombre anterior:

col_dict = {''gdp'': ''log(gdp)'', ''cap'': ''cap_mod''} ## key→old name, value→new name df.columns = [col_dict.get(x, x) for x in df.columns]

Tiempos:

%%timeit df.rename(columns={''gdp'':''log(gdp)''}, inplace=True) 10000 loops, best of 3: 168 µs per loop %%timeit df.columns = [''log(gdp)'' if x==''gdp'' else x for x in df.columns] 10000 loops, best of 3: 58.5 µs per loop


data.rename(columns={''gdp'':''log(gdp)''}, inplace=True)

El rename muestra que acepta un dict como un param para columns por lo que simplemente pasa un dict con una sola entrada.

Ver también related