Panda’s index kolom titel of naam

Hoe krijg ik de naam van de indexkolom in Python Panda’s? Hier is een voorbeeld dataframe:

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

Wat ik probeer te doen is de Dataframe-indextitel krijgen / instellen. Dit is wat ik heb geprobeerd:

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

Iedereen weet hoe dit te doen?


Antwoord 1, Autoriteit 100%

U kunt gewoon de index krijgen / instellen via de nameEIGENSWONING

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

Antwoord 2, Autoriteit 20%

U kunt rename_axis, voor het verwijderen van ingesteld op 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

De nieuwe functionaliteit werkt goed in methodeketens.

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

Je kunt de kolomnamen ook hernoemen met parameter 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

Vanaf versie pandas 0.24.0+is het mogelijk parameter indexen columnste gebruiken:

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

Het verwijderen van index- en kolomnamen betekent instellen op 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

Indien MultiIndexalleen in 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

Index- en kolommen-namen verwijderen betekent instellen op 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

Voor MultiIndexIN INDEX EN KOLOMMEN WERKT WERKEN MET .namesin plaats daarvan .namesEN SET PER LIJST OF 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

Plural is nodig voor cheque / ingestelde waarden:

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

Het verwijderen van index- en kolomnamen betekent instellen op 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

En @Jeff-oplossing:

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

Antwoord 3, autoriteit 6%

df.index.namezou het lukken.

Python heeft een functie dirwaarmee u objectkenmerken kunt opvragen. dir(df.index)was hier nuttig.


Antwoord 4, autoriteit 4%

Gebruik df.index.rename('foo', inplace=True)om de indexnaam in te stellen.

Het lijkt erop dat deze api beschikbaar is sinds panda’s 0.13.


Antwoord 5, autoriteit 3%

Als u geen nieuwe rij wilt maken, maar deze gewoon in de lege cel wilt plaatsen, gebruik dan:

df.columns.name = 'foo'

Anders gebruik:

df.index.name = 'foo'

Antwoord 6, autoriteit 2%

Het instellen van de indexnaam kan ook worden bereikt bij het maken:

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

Antwoord 7

df.columns.valuesgeeft ons ook de kolomnamen


Antwoord 8

De oplossing voor multi-indexen zit in het cyclopedische antwoord van Jezrael, maar het kostte me een tijdje om het te vinden, dus plaats ik een nieuw antwoord:

df.index.namesgeeft de namen van een multi-index (als een Frozenlist).


Antwoord 9

Om alleen de indexkolomnamen te krijgen, werkt df.index.namesvoor zowel een enkele Index als MultiIndex vanaf de meest recente versie van panda’s.

Als iemand die dit vond toen ik probeerde de beste manier te vinden om een lijst met indexnamen + kolomnamen te krijgen, zou ik dit antwoord nuttig hebben gevonden:

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

Dit werkt voor geen index, index met één kolom of MultiIndex. Het vermijdt het aanroepen van reset_index() die een onnodige prestatiehit heeft voor zo’n eenvoudige operatie. Het verbaast me dat hier geen ingebouwde methode voor is (die ik ben tegengekomen). Ik denk dat ik dit vaker nodig heb omdat ik gegevens uit databases pendel waar de dataframe-index is toegewezen aan een primaire/unieke sleutel, maar het is eigenlijk gewoon een andere kolom voor mij.

Other episodes