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
renameha agregado el parámetro deaxisque se puede establecer encolumnso1. Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene los parámetros deindexycolumns, pero ya no está obligado a usarlos. - El método
set_indexconinplaceestablecido enFalsepermite 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