Titolo o nome della colonna dell'indice Panda


255

Come posso ottenere il nome della colonna dell'indice in python panda? Ecco un esempio di frame di dati:

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

Quello che sto cercando di fare è ottenere / impostare il titolo dell'indice del frame di dati. Ecco cosa ho provato:

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

Qualcuno sa come farlo?

Risposte:


367

Puoi semplicemente ottenere / impostare l'indice tramite la sua nameproprietà

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

10
A partire da ora (0.16) non funziona. O meglio: funziona, ma non appena DataFrame viene modificato, cancella il nome dell'indice.
Piotr Migdal,

11
dovrebbe essere possibile specificare il nome dell'indice al momento della creazione di DataFrame. es pd.DataFrame(values,index={"INDEX_NAME":index_values}). Non capisco perché questo non sia consentito o implementato?
denfromufa,

1
puoi costruire direttamente con un indice per aggiungere un nome
Jeff

@Jeff, sembra la tua osservazione che costruire prima l'indice (e usarlo per l'indice e le colonne del dataframe) sia l'approccio corretto anche se concordo con @denfromufaquesto che dovrebbe prendere un dettato come parametri per costruire da Panda.DataFrame
Diego Aguado

3
Se si tratta di un Multiindex, utilizzare df.index.namesinvece di df.index.name.
Jasha,

75

È possibile utilizzare rename_axis, per la rimozione, impostare su 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 nuova funzionalità funziona bene nelle catene di metodi.

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

Puoi anche rinominare i nomi delle colonne con il parametro 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

Dalla versione pandas 0.24.0+è possibile utilizzare il parametro 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

Rimuovere i nomi di indice e colonne significa impostarlo su 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 MultiIndexsolo in indice:

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

Rimuovere i nomi di indice e colonne significa impostarlo su 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

Per MultiIndexin indice e colonne è necessario lavorare con .namesinvece .namee impostato per elenco o tuple:

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

Plurale è necessario per controllare / impostare i valori:

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

Rimuovere i nomi di indice e colonne significa impostarlo su 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 la soluzione @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

7
Credo che questa dovrebbe essere la risposta accettata per le attuali versioni di
Panda

2
Anche la pena notare, come suggerisce Phil in un'altra df.index.rename('foo', inplace=True)see pandas.pydata.org/pandas-docs/stable/generated/...
Thomas Fauskanger

Ho importato un dizionario da utilizzare come frame di dati, pertanto la colonna dell'indice è stata impostata automaticamente su Nessuno con le righe numerate 1-10. Ma vorrei assegnare la colonna "nomi" come indice. E se possibile farlo durante la stampa. È possibile farlo ed è possibile farlo al volo durante la trama?
Tokyo,

28

df.index.name dovrebbe fare il trucco.

Python ha una dirfunzione che ti permette di interrogare gli attributi degli oggetti. dir(df.index)è stato utile qui.


17

Utilizzare df.index.rename('foo', inplace=True)per impostare il nome dell'indice.

Sembra che questa API sia disponibile da Panda 0.13 .


1
Caspita ... una soluzione elegante!
Alfonso,

13

Se non si desidera creare una nuova riga ma semplicemente inserirla nella cella vuota, utilizzare:

df.columns.name = 'foo'

Altrimenti usa:

df.index.name = 'foo'

1
Ho appena trovato che è un nome per i nomi delle colonne. Non c'è da stupirsi che l'impostazione di df.index.name ti dia un nuovo livello. Grazie!
Charles,

6

df.columns.values dacci anche i nomi delle colonne


1

La soluzione per più indici è nella risposta ciclopica di jezrael, ma mi ci è voluto un po 'per trovarla, quindi sto postando una nuova risposta:

df.index.names fornisce i nomi di un multiindice (come Frozenlist).


1

Per ottenere solo i nomi delle colonne dell'indice df.index.namesfunzionerà sia per un singolo indice sia per MultiIndex a partire dalla versione più recente dei panda.

Come qualcuno che ha trovato questo mentre cercava di trovare il modo migliore per ottenere un elenco di nomi di indice + nomi di colonne, avrei trovato utile questa risposta:

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

Funziona senza indice, indice a colonna singola o MultiIndex. Evita di chiamare reset_index () che ha un impatto sulle prestazioni non necessario per un'operazione così semplice. Sono sorpreso che non ci sia un metodo integrato per questo (che ho incontrato). Immagino di averne bisogno più spesso perché sto trasferendo i dati dai database in cui l'indice del frame di dati è associato a una chiave primaria / unica, ma in realtà è solo un'altra colonna per me.


1

L'impostazione del nome dell'indice può essere eseguita anche al momento della creazione:

pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name='Tag'))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.