Título o nombre de la columna de índice de pandas

255

¿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 intento 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"]
print df

Alguien sabe cómo hacer esto?

Edward radical
fuente

Respuestas:

367

Solo puede obtener / establecer el índice a través de su namepropiedad

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
Jeff
fuente
10
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
debería ser posible especificar el nombre del índice en el momento de creación del DataFrame. por ej pd.DataFrame(values,index={"INDEX_NAME":index_values}). No entiendo por qué esto no está permitido o implementado.
denfromufa 01 de
1
puede construir directamente con un índice para agregar un nombre
Jeff
@Jeff, parece su observación de que construir el índice primero (y usarlo para el índice y las columnas del marco de datos) es el enfoque correcto, aunque estoy de acuerdo con @denfromufaeso, debería tomar un dict como parámetros para construir desde pandas.DataFrame
Diego Aguado
3
Si es un Multiindex, use en df.index.nameslugar de df.index.name.
Jasha
75

Puede usar rename_axis, para eliminar 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

Desde la versión pandas 0.24.0+es posible usar el parámetro indexy 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 índice y columnas significa configurarlo 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 MultiIndexsolo está en el í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 índice y columnas significa configurarlo 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

En el MultiIndexíndice y las columnas es necesario trabajar en su .nameslugar .namey 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

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 índice y columnas significa configurarlo 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 @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
jezrael
fuente
77
Creo que esta debería ser la respuesta aceptada para las versiones actuales de pandas
Thomas Fauskanger
2
También vale la pena señalar, como phil sugiere en otro df.index.rename('foo', inplace=True)ver pandas.pydata.org/pandas-docs/stable/generated/…
Thomas Fauskanger
He importado un diccionario para usarlo como marco de datos, por lo tanto, la columna de índice se configuró automáticamente en Ninguna con las filas numeradas del 1 al 10. Pero me gustaría asignar la columna "nombres" como índice. Y si es posible, haga esto durante el trazado. ¿Es posible hacer esto y es posible hacerlo sobre la marcha mientras trazamos?
TokioToo
28

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

Python tiene una dirfunción que le permite consultar los atributos del objeto. dir(df.index)Fue útil aquí.

perezoso1
fuente
17

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

Parece que esta API está disponible desde pandas 0.13 .

phil
fuente
1
Wow ... una solución elegante!
alfonso
13

Si no desea crear una nueva fila, sino simplemente ponerla en la celda vacía, use:

df.columns.name = 'foo'

De lo contrario, use:

df.index.name = 'foo'
Keith
fuente
1
Lo acabo de encontrar es un nombre para los nombres de las columnas. No es de extrañar que establecer df.index.name le brinde un nuevo nivel. ¡Gracias!
Charles
6

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

pvarma
fuente
1

La solución para los índices múltiples está dentro de la respuesta ciclopédica de Israel, pero me tomó un tiempo encontrarla, así que estoy publicando una nueva respuesta:

df.index.names da los nombres de un índice múltiple (como una lista congelada).

El gato no divertido
fuente
1

Simplemente obtener los nombres de las columnas de índice df.index.namesfuncionará tanto para un solo índice como para MultiIndex a partir de la versión más reciente de los pandas.

Como alguien que encontró esto mientras trataba de encontrar la mejor manera de obtener una lista de nombres de índice + nombres de columna, esta respuesta me habría resultado útil:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

Esto funciona para ningún índice, índice de columna única o índice múltiple. Evita llamar a reset_index () que tiene un impacto de rendimiento innecesario para una operación tan simple. Me sorprende que no haya un método integrado para esto (que he encontrado). Supongo que necesito esto más a menudo porque estoy transfiriendo datos de bases de datos donde el índice del marco de datos se asigna a una clave primaria / única, pero en realidad es solo otra columna para mí.

totalhack
fuente
1

Establecer el 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'))
dusiod
fuente