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 deaxis
que se puede establecer encolumns
o1
. Esta actualización hace que este método coincida con el resto de la API de pandas. Todavía tiene los parámetros deindex
ycolumns
, pero ya no está obligado a usarlos. - El método
set_index
coninplace
establecido enFalse
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