Nom ou titre de la colonne d'index des pandas

255

Comment obtenir le nom de la colonne d'index dans les pandas python? Voici un exemple de trame de données:

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

Ce que j'essaie de faire est d'obtenir / définir le titre de l'index de la trame de données. Voici ce que j'ai essayé:

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

Quelqu'un sait-il comment faire ça?

Radical Edward
la source

Réponses:

367

Vous pouvez simplement obtenir / définir l'index via sa namepropriété

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
la source
10
Pour l'instant (0,16), cela ne fonctionne pas. Ou plutôt - cela fonctionne, mais dès que DataFrame est modifié, il efface le nom de l'index.
Piotr Migdal
11
il devrait être possible de spécifier le nom de l'index au moment de la création de DataFrame. par exemple pd.DataFrame(values,index={"INDEX_NAME":index_values}). Je ne comprends pas pourquoi cela n'est pas autorisé ou mis en œuvre?
denfromufa
1
vous pouvez directement construire avec un index pour ajouter un nom
Jeff
@Jeff, ressemble à votre observation selon laquelle la construction de l'index en premier (et l'utiliser pour l'index et les colonnes de la trame de données) est la bonne approche bien que je convienne @denfromufaqu'il devrait prendre un dict comme paramètres à construire à partir de pandas.DataFrame
Diego Aguado
3
S'il s'agit d'un Multiindex, utilisez à la df.index.namesplace de df.index.name.
Jasha
75

Vous pouvez utiliser rename_axis, pour supprimer l'ensemble défini sur 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 nouvelle fonctionnalité fonctionne bien dans les chaînes de méthodes.

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

Vous pouvez également renommer les noms de colonne avec le paramètre 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 de la version pandas 0.24.0+est possible utiliser le paramètre indexet 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

La suppression des noms d'index et de colonnes signifie la définir sur 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 MultiIndexdans l'index uniquement:

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

La suppression des noms d'index et de colonnes signifie qu'il doit être défini sur 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

Pour MultiIndexdans l'index et les colonnes est nécessaire de travailler avec.names place .nameet défini par liste ou tuples:

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

Le pluriel est nécessaire pour vérifier / régler les valeurs:

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

La suppression des noms d'index et de colonnes signifie qu'il doit être défini sur 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

Et la solution @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
la source
7
Je crois que cela devrait être la réponse acceptée pour les versions actuelles des pandas
Thomas Fauskanger
2
A noter également, comme phil le suggère dans un autre, df.index.rename('foo', inplace=True)voir pandas.pydata.org/pandas-docs/stable/generated/…
Thomas Fauskanger
J'ai importé un dictionnaire pour l'utiliser comme trame de données, par conséquent, la colonne d'index a été définie automatiquement sur Aucune avec des lignes numérotées de 1 à 10. Mais je voudrais attribuer la colonne "noms" comme index. Et si possible, faites-le pendant le traçage. Est-il possible de le faire et est-il possible de le faire à la volée pendant que nous traçons?
TokyoToo
28

df.index.name devrait faire l'affaire.

Python a une dirfonction qui vous permet d'interroger les attributs des objets. dir(df.index)a été utile ici.

lazy1
la source
17

Utilisez df.index.rename('foo', inplace=True)pour définir le nom de l'index.

Il semble que cette API soit disponible depuis les pandas 0.13 .

phil
la source
1
Wow ... une solution élégante!
alfonso
13

Si vous ne souhaitez pas créer une nouvelle ligne mais simplement la mettre dans la cellule vide, utilisez:

df.columns.name = 'foo'

Sinon, utilisez:

df.index.name = 'foo'
Keith
la source
1
Je viens de le trouver, c'est un nom pour les noms des colonnes. Pas étonnant que la définition de df.index.name vous donne un nouveau niveau. Je vous remercie!
Charles
6

df.columns.values donnez-nous également les noms des colonnes

pvarma
la source
1

La solution pour les multi-index se trouve dans la réponse cyclopédique de jezrael, mais il m'a fallu un certain temps pour la trouver, donc je poste une nouvelle réponse:

df.index.names donne les noms d'un multi-index (comme une liste gelée).

Le chat unfun
la source
1

Pour obtenir simplement les noms des colonnes d'index df.index.names cela fonctionnera pour un seul index ou multi-index à partir de la version la plus récente de pandas.

En tant que personne qui a trouvé cela en essayant de trouver la meilleure façon d'obtenir une liste de noms d'index + noms de colonnes, j'aurais trouvé cette réponse utile:

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

Cela fonctionne pour aucun index, Index à colonne unique ou MultiIndex. Il évite d'appeler reset_index () qui a un impact de performance inutile pour une opération aussi simple. Je suis surpris qu'il n'y ait pas de méthode intégrée pour cela (que j'ai rencontré). Je suppose que j'en ai besoin plus souvent parce que je transfère des données à partir de bases de données où l'index de la trame de données correspond à une clé primaire / unique, mais n'est vraiment qu'une autre colonne pour moi.

totalhack
la source
1

La définition du nom d'index peut également être effectuée lors de la création:

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