Judul atau nama kolom indeks panda

255

Bagaimana cara mendapatkan nama kolom indeks dalam python panda? Berikut ini contoh bingkai data:

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

Apa yang saya coba lakukan adalah mendapatkan / mengatur judul indeks dataframe. Inilah yang saya coba:

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

Adakah yang tahu bagaimana melakukan ini?

Edward yang radikal
sumber

Jawaban:

367

Anda bisa mendapatkan / mengatur indeks melalui namepropertinya

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
sumber
10
Sampai sekarang (0.16) tidak berfungsi. Atau lebih tepatnya - itu berfungsi, tetapi segera setelah DataFrame diubah, ia menghapus nama indeks.
Piotr Migdal
11
harus mungkin untuk menentukan nama indeks pada waktu pembuatan DataFrame. mis pd.DataFrame(values,index={"INDEX_NAME":index_values}). Saya tidak mengerti mengapa ini tidak diizinkan atau diterapkan?
denfromufa
1
Anda dapat langsung membuat dengan Indeks untuk menambahkan nama
Jeff
@ Jeff, sepertinya pengamatan Anda bahwa membangun indeks terlebih dahulu (dan menggunakannya untuk indeks dan kolom dataframe) adalah pendekatan yang benar meskipun saya setuju dengan @denfromufaitu harus mengambil dict sebagai parameter untuk membangun dari pandas.DataFrame
Diego Aguado
3
Jika itu adalah Multiindex, gunakan df.index.namessebagai ganti df.index.name.
Jasha
75

Anda dapat menggunakan rename_axis, untuk menghapus set ke 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

Fungsionalitas baru berfungsi dengan baik dalam rantai metode.

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

Anda juga dapat mengganti nama nama kolom dengan 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

Dari versi pandas 0.24.0+dimungkinkan menggunakan parameter indexdan 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

Menghapus nama indeks dan kolom berarti mengaturnya untuk 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

Jika MultiIndexhanya dalam indeks:

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

Menghapus nama indeks dan kolom berarti mengaturnya untuk 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

Karena MultiIndexdalam indeks dan kolom perlu bekerja dengan .namesgantinya .namedan ditetapkan oleh daftar atau tupel:

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 diperlukan untuk memeriksa / menetapkan nilai:

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

Menghapus nama indeks dan kolom berarti mengaturnya untuk 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

Dan solusi @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
sumber
7
Saya percaya ini harus menjadi jawaban yang diterima untuk versi panda saat ini
Thomas Fauskanger
2
Juga diperhatikan, seperti phil menyarankan dalam lainnya df.index.rename('foo', inplace=True)lihat pandas.pydata.org/pandas-docs/stable/generated/...
Thomas Fauskanger
Saya telah mengimpor kamus untuk digunakan sebagai kerangka data sehingga kolom indeks diatur secara otomatis ke Tidak Ada dengan baris diberi nomor 1-10. Tapi saya ingin menetapkan kolom "nama" sebagai indeks. Dan jika mungkin lakukan ini selama merencanakan. Apakah mungkin untuk melakukan ini dan apakah mungkin melakukan ini dengan cepat saat kita merencanakan?
TokyoToo
28

df.index.name harus melakukan trik.

Python memiliki dirfungsi yang memungkinkan Anda menanyakan atribut objek. dir(df.index)sangat membantu di sini.

lazy1
sumber
17

Gunakan df.index.rename('foo', inplace=True)untuk mengatur nama indeks.

Tampaknya api ini tersedia sejak panda 0,13 .

phil
sumber
1
Wow ... solusi elegan!
alfonso
13

Jika Anda tidak ingin membuat baris baru tetapi cukup taruh di sel kosong kemudian gunakan:

df.columns.name = 'foo'

Kalau tidak gunakan:

df.index.name = 'foo'
Keith
sumber
1
Baru saja menemukannya, itu adalah nama untuk nama kolom. Tidak heran jika pengaturan df.index.name memberi Anda level baru. Terima kasih!
Charles
6

df.columns.values juga beri kami nama kolom

pvarma
sumber
1

Solusi untuk multi-indeks ada di dalam jawaban cyclopedic jezrael, tetapi butuh beberapa saat untuk menemukannya sehingga saya memposting jawaban baru:

df.index.names memberikan nama-nama multi-indeks (sebagai Frozenlist).

Kucing Unfun
sumber
1

Untuk hanya mendapatkan nama kolom indeks df.index.names akan berfungsi baik untuk Indeks tunggal atau MultiIndex pada versi panda terbaru.

Sebagai seseorang yang menemukan ini ketika mencoba menemukan cara terbaik untuk mendapatkan daftar nama indeks + nama kolom, saya akan menemukan jawaban ini bermanfaat:

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

Ini berfungsi tanpa indeks, Indeks kolom tunggal, atau MultiIndex. Ini menghindari panggilan reset_index () yang memiliki hit kinerja yang tidak perlu untuk operasi sederhana. Saya terkejut tidak ada metode bawaan untuk ini (yang saya temui). Saya kira saya mengalami lebih sering membutuhkan ini karena saya bolak-balik data dari database di mana indeks dataframe peta ke kunci utama / unik, tetapi sebenarnya hanya kolom lain bagi saya.

totalhack
sumber
1

Menyetel nama indeks juga dapat dilakukan saat pembuatan:

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