¿Cómo obtener/establecer un título o nombre de columna de índice de pandas?

7 minutos de lectura

Avatar de usuario de Radical Edward
eduardo radical

¿Cómo obtengo el nombre de la columna de índice en los pandas de Python? Aquí hay un marco de datos de ejemplo:

             Column 1
Index Title          
Apples              1
Oranges             2
Puppies             3
Ducks               4  

Lo que estoy tratando de hacer es obtener/establecer el título del índice del marco de datos. Esto es lo que probé:

import pandas as pd

data = {'Column 1'   : [1., 2., 3., 4.], 
        'Index Title': ["Apples", "Oranges", "Puppies", "Ducks"]}
df = pd.DataFrame(data)
df.index = df["Index Title"]
del df["Index Title"]

Alguien sabe cómo hacer esto?

Simplemente puede obtener/establecer el índice a través de su name propiedad

In [7]: df.index.name
Out[7]: 'Index Title'

In [8]: df.index.name="foo"

In [9]: df.index.name
Out[9]: 'foo'

In [10]: df
Out[10]: 
         Column 1
foo              
Apples          1
Oranges         2
Puppies         3
Ducks           4

  • A partir de ahora (0.16) no funciona. O más bien, funciona, pero tan pronto como DataFrame se modifica, borra el nombre del índice.

    –Piotr Migdal

    11/04/2015 a las 20:37

  • debería ser posible especificar el nombre del índice en el momento de la creación de DataFrame. p.ej pd.DataFrame(values,index={"INDEX_NAME":index_values}). No entiendo por qué esto no está permitido o implementado.

    – denfromufa

    01/04/2016 a las 14:42


  • puede construir directamente con un índice para agregar un nombre

    – Jeff

    01/04/2016 a las 16:15

  • @Jeff, parece que su observación de que construir primero el índice (y usarlo para el índice y las columnas del marco de datos) es el enfoque correcto, aunque estoy de acuerdo con @denfromufa que debería tomar un dict como parámetros para construir desde pandas.DataFrame

    – Diego Aguado

    7 de marzo de 2017 a las 18:27

  • Si es un Multiíndice, utilice df.index.names en lugar de df.index.name.

    – Jasha

    2 de septiembre de 2018 a las 0:03

avatar de usuario de jezrael
jezrael

Puedes usar rename_axispara quitar el conjunto a None:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title')
print (df)
             Column 1
Index Title          
Apples            1.0
Oranges           2.0
Puppies           3.0
Ducks             4.0

print (df.index.name)
Index Title

print (df.columns.name)
None

La nueva funcionalidad funciona bien en cadenas de métodos.

df = df.rename_axis('foo')
print (df)
         Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

También puede cambiar el nombre de las columnas con el parámetro axis:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title').rename_axis('Col Name', axis=1)
print (df)
Col Name     Column 1
Index Title          
Apples            1.0
Oranges           2.0
Puppies           3.0
Ducks             4.0

print (df.index.name)
Index Title

print (df.columns.name)
Col Name
print df.rename_axis('foo').rename_axis("bar", axis="columns")
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

print df.rename_axis('foo').rename_axis("bar", axis=1)
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

De la versión pandas 0.24.0+ es posible usar el parámetro index y columns:

df = df.rename_axis(index='foo', columns="bar")
print (df)
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Eliminar los nombres de índices y columnas significa establecerlo en None:

df = df.rename_axis(index=None, columns=None)
print (df)
         Column 1
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Si MultiIndex solo en índice:

mux = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                  list('abcd')], 
                                  names=['index name 1','index name 1'])


df = pd.DataFrame(np.random.randint(10, size=(4,6)), 
                  index=mux, 
                  columns=list('ABCDEF')).rename_axis('col name', axis=1)
print (df)
col name                   A  B  C  D  E  F
index name 1 index name 1                  
Apples       a             5  4  0  5  2  2
Oranges      b             5  8  2  5  9  9
Puppies      c             7  6  0  7  8  3
Ducks        d             6  5  0  1  6  0

print (df.index.name)
None

print (df.columns.name)
col name

print (df.index.names)
['index name 1', 'index name 1']

print (df.columns.names)
['col name']

df1 = df.rename_axis(('foo','bar'))
print (df1)
col name     A  B  C  D  E  F
foo     bar                  
Apples  a    5  4  0  5  2  2
Oranges b    5  8  2  5  9  9
Puppies c    7  6  0  7  8  3
Ducks   d    6  5  0  1  6  0

df2 = df.rename_axis('baz', axis=1)
print (df2)
baz                        A  B  C  D  E  F
index name 1 index name 1                  
Apples       a             5  4  0  5  2  2
Oranges      b             5  8  2  5  9  9
Puppies      c             7  6  0  7  8  3
Ducks        d             6  5  0  1  6  0

df2 = df.rename_axis(index=('foo','bar'), columns="baz")
print (df2)
baz          A  B  C  D  E  F
foo     bar                  
Apples  a    5  4  0  5  2  2
Oranges b    5  8  2  5  9  9
Puppies c    7  6  0  7  8  3
Ducks   d    6  5  0  1  6  0

Eliminar los nombres de índices y columnas significa establecerlo en None:

df2 = df.rename_axis(index=(None,None), columns=None)
print (df2)

           A  B  C  D  E  F
Apples  a  6  9  9  5  4  6
Oranges b  2  6  7  4  3  5
Puppies c  6  3  6  3  5  1
Ducks   d  4  9  1  3  0  5

Para MultiIndex en índice y columnas es necesario trabajar con .names en cambio .name y establecer por lista o tuplas:

mux1 = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                  list('abcd')], 
                                  names=['index name 1','index name 1'])


mux2 = pd.MultiIndex.from_product([list('ABC'),
                                  list('XY')], 
                                  names=['col name 1','col name 2'])

df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux1, columns=mux2)
print (df)
col name 1                 A     B     C   
col name 2                 X  Y  X  Y  X  Y
index name 1 index name 1                  
Apples       a             2  9  4  7  0  3
Oranges      b             9  0  6  0  9  4
Puppies      c             2  4  6  1  4  4
Ducks        d             6  6  7  1  2  8

El plural es necesario para verificar/establecer valores:

print (df.index.name)
None

print (df.columns.name)
None

print (df.index.names)
['index name 1', 'index name 1']

print (df.columns.names)
['col name 1', 'col name 2']

df1 = df.rename_axis(('foo','bar'))
print (df1)
col name 1   A     B     C   
col name 2   X  Y  X  Y  X  Y
foo     bar                  
Apples  a    2  9  4  7  0  3
Oranges b    9  0  6  0  9  4
Puppies c    2  4  6  1  4  4
Ducks   d    6  6  7  1  2  8

df2 = df.rename_axis(('baz','bak'), axis=1)
print (df2)
baz                        A     B     C   
bak                        X  Y  X  Y  X  Y
index name 1 index name 1                  
Apples       a             2  9  4  7  0  3
Oranges      b             9  0  6  0  9  4
Puppies      c             2  4  6  1  4  4
Ducks        d             6  6  7  1  2  8

df2 = df.rename_axis(index=('foo','bar'), columns=('baz','bak'))
print (df2)
baz          A     B     C   
bak          X  Y  X  Y  X  Y
foo     bar                  
Apples  a    2  9  4  7  0  3
Oranges b    9  0  6  0  9  4
Puppies c    2  4  6  1  4  4
Ducks   d    6  6  7  1  2  8

Eliminar los nombres de índices y columnas significa establecerlo en None:

df2 = df.rename_axis(index=(None,None), columns=(None,None))
print (df2)

           A     B     C   
           X  Y  X  Y  X  Y
Apples  a  2  0  2  5  2  0
Oranges b  1  7  5  5  4  8
Puppies c  2  4  6  3  6  5
Ducks   d  9  6  3  9  7  0

Y la solución de @Jeff:

df.index.names = ['foo','bar']
df.columns.names = ['baz','bak']
print (df)

baz          A     B     C   
bak          X  Y  X  Y  X  Y
foo     bar                  
Apples  a    3  4  7  3  3  3
Oranges b    1  2  5  8  1  0
Puppies c    9  6  3  9  6  3
Ducks   d    3  2  1  0  1  0

  • También vale la pena señalar, como sugiere phil en otro df.index.rename('foo', inplace=True) ver pandas.pydata.org/pandas-docs/stable/generated/…

    –Tomás Fauskanger

    26 de junio de 2018 a las 14:20


  • Importé un diccionario para usarlo como marco de datos, por lo tanto, la columna de índice se configuró automáticamente en Ninguno con las filas numeradas del 1 al 10. Pero me gustaría asignar la columna “nombres” como índice. Y si es posible, haz esto durante el trazado. ¿Es posible hacer esto y es posible hacerlo sobre la marcha mientras planeamos?

    – Tokio también

    24 de mayo de 2020 a las 8:11


  • jezrael dio la respuesta correcta a la pregunta original, que se refería a los nombres de los índices de las columnas, no a los nombres de los índices de las filas. Además de una explicación completa. Básicamente, para que Radical Edward tenga el nombre de la columna de índice, solo necesita usar df.index.names

    – Rodolfo Bugarín

    12 de febrero de 2021 a las 12:17

df.index.name debería hacer el truco.

Pitón tiene un dir función que le permite consultar atributos de objetos. dir(df.index) fue útil aquí.

Usar df.index.rename('foo', inplace=True) para establecer el nombre del índice.

Parece que esta API está disponible desde pandas 0.13.

Si no desea crear una nueva fila, simplemente colóquela en la celda vacía, use:

df.columns.name="foo"

De lo contrario, use:

df.index.name="foo"

  • Acabo de encontrarlo, es un nombre para los nombres de las columnas. No es de extrañar que configurar df.index.name le dé un nuevo nivel. ¡Gracias!

    – CW

    15 de junio de 2017 a las 15:52

avatar de usuario de dusio
Dusio

La configuración del nombre del índice también se puede lograr en la creación:

pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name="Tag"))

  • Acabo de encontrarlo, es un nombre para los nombres de las columnas. No es de extrañar que configurar df.index.name le dé un nuevo nivel. ¡Gracias!

    – CW

    15 de junio de 2017 a las 15:52

avatar de usuario de pnv
pnv

df.columns.values también danos los nombres de las columnas

¿Ha sido útil esta solución?