Tytuł lub nazwa kolumny indeksu Pandy

254

Jak uzyskać nazwę kolumny indeksu w pandach python? Oto przykładowa ramka danych:

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

Próbuję uzyskać / ustawić tytuł indeksu ramki danych. Oto, co próbowałem:

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

Czy ktoś wie jak to zrobić?

Radykalny Edward
źródło

Odpowiedzi:

366

Możesz po prostu pobrać / ustawić indeks za pomocą jego namewłaściwości

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
źródło
10
Na razie (0,16) nie działa. A raczej - działa, ale gdy tylko DataFrame zostanie zmodyfikowany, usuwa nazwę indeksu.
Piotr Migdal
11
powinno być możliwe określenie nazwy indeksu w czasie tworzenia DataFrame. np pd.DataFrame(values,index={"INDEX_NAME":index_values}). Nie rozumiem, dlaczego nie jest to dozwolone lub realizowane?
denfromufa
1
możesz bezpośrednio skonstruować za pomocą indeksu, aby dodać nazwę
Jeff
@Jeff, wygląda na twoją obserwację, że najpierw konstruowanie indeksu (i użycie go do indeksu i kolumn ramki danych) jest poprawnym podejściem, chociaż zgadzam się z @denfromufatym, że powinien on wziąć dyktand jako parametry do skonstruowania z pandas.DataFrame
Diego Aguado
3
Jeśli jest to Multiindex, użyj df.index.nameszamiast df.index.name.
Jasha
75

Możesz użyć rename_axisdo usunięcia zestawu 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

Nowa funkcjonalność działa dobrze w łańcuchach metod.

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

Możesz także zmienić nazwy kolumn za pomocą parametru 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

Z wersji pandas 0.24.0+można użyć parametru indexi 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

Usunięcie nazw indeksów i kolumn oznacza ustawienie na 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

Jeśli MultiIndextylko w indeksie:

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

Usunięcie nazw indeksów i kolumn oznacza ustawienie na 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

Ponieważ MultiIndexw indeksie i kolumnach konieczna jest praca z.names zamiast .namei ustawianie według listy lub krotek:

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

Liczba mnoga jest niezbędna do sprawdzania / ustawiania wartości:

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

Usunięcie nazw indeksów i kolumn oznacza ustawienie na 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

I rozwiązanie @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
źródło
7
Uważam, że taka powinna być zaakceptowana odpowiedź na obecne wersje pand
Thomas Fauskanger
2
Warto również zauważyć, jak sugeruje Phil w innym df.index.rename('foo', inplace=True)zobaczyć pandas.pydata.org/pandas-docs/stable/generated/...
Thomas Fauskanger
Zaimportowałem słownik, który ma być używany jako ramka danych, dlatego kolumna indeksu została automatycznie ustawiona na Brak z wierszami o numerach 1-10. Ale chciałbym przypisać kolumnę „nazwy” jako indeks. I jeśli to możliwe, zrób to podczas kreślenia. Czy można to zrobić i czy można to zrobić w locie, gdy planujemy?
TokyoToo
28

df.index.name powinien załatwić sprawę.

Python ma dirfunkcję, która pozwala ci wyszukiwać atrybuty obiektów. dir(df.index)był pomocny tutaj.

leniwy 1
źródło
17

Użyj, df.index.rename('foo', inplace=True)aby ustawić nazwę indeksu.

Wygląda na to, że ten api jest dostępny od pand 0.13 .

phil
źródło
1
Wow ... eleganckie rozwiązanie!
alfonso
13

Jeśli nie chcesz tworzyć nowego wiersza, ale po prostu umieść go w pustej komórce, użyj:

df.columns.name = 'foo'

W przeciwnym razie użyj:

df.index.name = 'foo'
Keith
źródło
1
Właśnie znalazłem, że to nazwa nazw kolumn. Nic dziwnego, że ustawienie df.index.name daje nowy poziom. Dziękuję Ci!
Charles
6

df.columns.values podaj także nazwy kolumn

pvarma
źródło
1

Rozwiązanie dla wielu indeksów znajduje się w cyklopedycznej odpowiedzi jezraela, ale znalezienie go zajęło mi trochę czasu, więc zamieszczam nową odpowiedź:

df.index.names podaje nazwy wielu indeksów (jako Frozenlist).

The Unfun Cat
źródło
1

Aby uzyskać kolumny indeksu, nazwy df.index.namesbędą działać zarówno dla pojedynczego indeksu, jak i MultiIndex od najnowszej wersji pand.

Jako ktoś, kto znalazł to podczas próby znalezienia najlepszego sposobu uzyskania listy nazw indeksów + nazw kolumn, uznałbym tę odpowiedź za przydatną:

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

Działa to bez indeksu, indeksu jednokolumnowego lub MultiIndex. Pozwala to uniknąć wywoływania reset_index (), który ma niepotrzebny spadek wydajności dla tak prostej operacji. Dziwię się, że nie ma na to wbudowanej metody (na którą się natknąłem). Wydaje mi się, że częściej tego potrzebuję, ponieważ przesyłam dane z baz danych, w których indeks ramki danych jest mapowany na klucz podstawowy / unikalny, ale tak naprawdę jest to dla mnie kolejna kolumna.

totalhack
źródło
1

Ustawienie nazwy indeksu można również wykonać podczas tworzenia:

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