Titel oder Name der Pandas-Indexspalte

254

Wie erhalte ich den Namen der Indexspalte in Python-Pandas? Hier ist ein Beispiel für einen Datenrahmen:

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

Ich versuche, den Titel des Datenrahmenindex abzurufen / festzulegen. Folgendes habe ich versucht:

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

Weiß jemand, wie man das macht?

Radikaler Edward
quelle

Antworten:

366

Sie können den Index einfach über seine nameEigenschaft abrufen / festlegen

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
quelle
10
Ab sofort (0.16) funktioniert es nicht. Oder besser gesagt - es funktioniert, aber sobald DataFrame geändert wird, wird der Indexname gelöscht.
Piotr Migdal
11
Es sollte möglich sein, den Indexnamen bei der Erstellung des DataFrame anzugeben. zB pd.DataFrame(values,index={"INDEX_NAME":index_values}). Ich verstehe nicht, warum dies nicht erlaubt oder implementiert ist?
Denfromufa
1
Sie können direkt mit einem Index konstruieren, um einen Namen hinzuzufügen
Jeff
@ Jeff, sieht aus wie Ihre Beobachtung, dass das erstmalige Erstellen des Index (und die Verwendung für den Index und die Spalten des Datenrahmens) der richtige Ansatz ist, obwohl ich damit einverstanden bin, @denfromufadass für die Erstellung aus pandas ein Diktat erforderlich ist. DataFrame
Diego Aguado
3
Wenn es sich um einen Multiindex handelt, verwenden Sie df.index.namesanstelle von df.index.name.
Jasha
75

Sie können rename_axiszum Entfernen Folgendes verwenden 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

Die neue Funktionalität funktioniert gut in Methodenketten.

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

Sie können auch Spaltennamen mit dem Parameter umbenannt 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

Ab Version pandas 0.24.0+ist möglich Parameter verwenden indexund 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

Wenn Sie Index- und Spaltennamen entfernen, müssen Sie Folgendes festlegen 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

Wenn nur MultiIndexim Index:

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

Wenn Sie Index- und Spaltennamen entfernen, müssen Sie Folgendes festlegen 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

Denn MultiIndexin Index und Spalten muss .namesstattdessen mit gearbeitet .nameund durch Liste oder Tupel festgelegt werden:

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

Für die Überprüfung / Einstellung von Werten ist Plural erforderlich:

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

Wenn Sie Index- und Spaltennamen entfernen, müssen Sie Folgendes festlegen 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

Und @ Jeff Lösung:

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
quelle
7
Ich glaube, dies sollte die akzeptierte Antwort für aktuelle Versionen von Pandas sein
Thomas Fauskanger
2
Ebenfalls erwähnenswert, wie Phil in einem anderen df.index.rename('foo', inplace=True)Artikel vorschlägt,
Thomas Fauskanger
Ich habe ein Wörterbuch importiert, das als Datenrahmen verwendet werden soll. Daher wurde die Indexspalte automatisch auf Keine gesetzt, wobei die Zeilen mit 1 bis 10 nummeriert sind. Ich möchte aber die Spalte "Namen" als Index zuweisen. Und wenn möglich, tun Sie dies beim Plotten. Ist es möglich, dies zu tun, und ist es möglich, dies im laufenden Betrieb zu tun, während wir planen?
TokyoToo
28

df.index.name sollte den Trick machen.

Python verfügt über eine dirFunktion, mit der Sie Objektattribute abfragen können. dir(df.index)war hier hilfreich.

faul1
quelle
17

Verwenden Sie df.index.rename('foo', inplace=True)diese Option , um den Indexnamen festzulegen.

Scheint, dass diese API seit Pandas 0.13 verfügbar ist .

phil
quelle
1
Wow ... eine elegante Lösung!
Alfonso
13

Wenn Sie keine neue Zeile erstellen möchten, sondern diese einfach in die leere Zelle einfügen möchten, verwenden Sie:

df.columns.name = 'foo'

Andernfalls verwenden Sie:

df.index.name = 'foo'
Keith
quelle
1
Ich habe gerade festgestellt, dass es sich um einen Namen für Spaltennamen handelt. Kein Wunder, dass Sie mit der Einstellung df.index.name eine neue Ebene erhalten. Danke dir!
Charles
6

df.columns.values Geben Sie uns auch die Spaltennamen

pvarma
quelle
1

Die Lösung für Multi-Indizes befindet sich in Jezraels zyklopädischer Antwort, aber es hat eine Weile gedauert, bis ich sie gefunden habe, sodass ich eine neue Antwort veröffentliche:

df.index.names gibt die Namen eines Multi-Index an (als Frozenlist).

Die Unfun Cat
quelle
1

Um nur die Indexspaltennamen zu erhalten df.index.names Indexspaltennamen zu erhalten, funktioniert dies sowohl für einen einzelnen Index als auch für MultiIndex ab der neuesten Version von Pandas.

Als jemand, der dies fand, während er versuchte, den besten Weg zu finden, um eine Liste von Indexnamen + Spaltennamen zu erhalten, hätte ich diese Antwort nützlich gefunden:

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

Dies funktioniert für keinen Index, einspaltigen Index oder MultiIndex. Es wird vermieden, reset_index () aufzurufen, was für eine so einfache Operation einen unnötigen Leistungseinbruch zur Folge hat. Ich bin überrascht, dass es dafür keine eingebaute Methode gibt (auf die ich gestoßen bin). Ich glaube, ich brauche das öfter, weil ich Daten aus Datenbanken pendle, in denen der Datenrahmenindex einem Primär- / eindeutigen Schlüssel zugeordnet ist, aber für mich wirklich nur eine weitere Spalte ist.

totalhack
quelle
1

Das Festlegen des Indexnamens kann auch bei der Erstellung erfolgen:

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