Título ou nome da coluna do índice do Pandas

255

Como obtenho o nome da coluna de índice nos pandas python? Aqui está um exemplo de quadro de dados:

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

O que estou tentando fazer é obter / definir o título do índice do quadro de dados. Aqui está o que eu tentei:

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

Alguém sabe como fazer isto?

Radical Edward
fonte

Respostas:

367

Você pode simplesmente obter / definir o índice através de sua namepropriedade

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
fonte
10
A partir de agora (0,16), ele não funciona. Ou melhor, ele funciona, mas assim que o DataFrame é modificado, ele apaga o nome do índice.
Piotr Migdal
11
deve ser possível especificar o nome do índice no momento da criação do DataFrame. por exemplo pd.DataFrame(values,index={"INDEX_NAME":index_values}). Não entendo por que isso não é permitido ou implementado?
Denfromufa
1
você pode construir diretamente com um Índice para adicionar um nome
Jeff
@ Jeff, parece que a sua observação de que a construção do Índice primeiro (e usá-lo para o índice da trama de dados e colunas) é a abordagem correta, embora eu concordo com @denfromufaque ele deve tomar um dicionário como parâmetros para a construção de pandas.DataFrame
Diego Aguado
3
Se for um Multi-índice, use em df.index.namesvez de df.index.name.
Jasha 02/02
75

Você pode usar rename_axis, para remover o conjunto para 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

A nova funcionalidade funciona bem em cadeias 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

Você também pode renomear nomes de colunas com o 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

A partir da versão pandas 0.24.0+é possível, use o parâmetro indexe 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

Remover nomes de índice e colunas significa configurá-lo para 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

Se MultiIndexapenas no í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

Remover nomes de índice e colunas significa configurá-lo para 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 MultiIndexno índice e nas colunas é necessário trabalhar em .namesvez disso .namee definir por lista ou 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

O plural é necessário para verificar / definir 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

Remover nomes de índice e colunas significa configurá-lo para 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

E a solução @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
fonte
7
Eu acredito que esta deve ser a resposta aceitos para as versões atuais do pandas
Thomas Fauskanger
2
Também digno de nota, como Phil sugere noutro df.index.rename('foo', inplace=True)ver pandas.pydata.org/pandas-docs/stable/generated/...
Thomas Fauskanger
Como importei um dicionário para ser usado como um quadro de dados, a coluna do índice foi definida automaticamente como Nenhuma, com as linhas numeradas de 1 a 10. Mas eu gostaria de atribuir a coluna "names" como o índice. E, se possível, faça isso durante a plotagem. É possível fazer isso e é possível fazer isso em tempo real enquanto planejamos?
TokyoToo
28

df.index.name deve fazer o truque.

Python tem uma dirfunção que permite consultar atributos de objetos. dir(df.index)foi útil aqui.

lazy1
fonte
17

Use df.index.rename('foo', inplace=True)para definir o nome do índice.

Parece que esta API está disponível desde os pandas 0.13 .

phil
fonte
1
Uau ... uma solução elegante!
alfonso
13

Se você não deseja criar uma nova linha, basta colocá-la na célula vazia e use:

df.columns.name = 'foo'

Caso contrário, use:

df.index.name = 'foo'
Keith
fonte
1
Acabei de descobrir que é um nome para os nomes das colunas. Não é à toa que a configuração de df.index.name fornece um novo nível. Obrigado!
Charles
6

df.columns.values também nos fornece os nomes das colunas

pvarma
fonte
1

A solução para vários índices está na resposta ciclopédica de jezrael, mas demorei um pouco para encontrá-la, por isso estou postando uma nova resposta:

df.index.names fornece os nomes de um índice múltiplo (como uma lista congelada).

The Unfun Cat
fonte
1

Para obter apenas o índice, os nomes das colunas df.index.namesfuncionarão para um único índice ou MultiIndex na versão mais recente do pandas.

Como alguém que encontrou isso enquanto tentava encontrar a melhor maneira de obter uma lista de nomes de índices + nomes de colunas, eu teria achado esta resposta útil:

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

Isso funciona para nenhum índice, índice de coluna única ou MultiIndex. Evita chamar reset_index () que possui um desempenho desnecessário para uma operação tão simples. Estou surpreso que não exista um método incorporado para isso (que eu já deparei). Acho que estou precisando disso com mais frequência porque estou transferindo dados de bancos de dados nos quais o índice do quadro de dados é mapeado para uma chave primária / exclusiva, mas na verdade é apenas mais uma coluna para mim.

totalhack
fonte
1

A configuração do nome do índice também pode ser realizada na criação:

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