Pandalar dizini sütun başlığı veya adı


255

Python pandalarında dizin sütun adını nasıl alabilirim? İşte bir örnek veri çerçevesi:

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

Ne yapmaya çalışıyorum olsun / veri çerçevesi dizin başlığı ayarlayın. İşte ne denedim:

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

Bunu nasıl yapacağını bilen var mı?

Yanıtlar:


367

Dizini nameözelliği aracılığıyla alabilir / ayarlayabilirsiniz

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

10
Şu andan itibaren (0.16) çalışmıyor. Ya da daha doğrusu - çalışır, ancak DataFrame değiştirilir değiştirilmez, dizin adını siler.
Piotr Migdal

11
DataFrame oluşturma zamanında dizin adı belirtmek mümkün olmalıdır. örn pd.DataFrame(values,index={"INDEX_NAME":index_values}). Buna neden izin verilmediğini veya uygulanmadığını anlamıyorum?
denfromufa

1
bir ad eklemek için doğrudan bir Endeks ile inşa edebilirsiniz
Jeff

@Jeff, ilk olarak endeksi oluşturmanın (ve veri çerçevesinin dizini ve sütunları için kullanmanın) doğru bir yaklaşım olduğunu gözlemlemenize benziyor, ancak @denfromufapandalardan inşa etmek için parametreler olarak bir dikte alması gerektiğine katılıyorum.DataFrame
Diego Aguado

3
Multiindex ise, df.index.namesyerine kullanın df.index.name.
Jasha

75

Aşağıdakileri rename_axisayarlamak için şunları kullanabilirsiniz 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

Yeni işlevsellik yöntem zincirlerinde iyi çalışır.

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

Ayrıca sütun adlarını şu parametreyle yeniden adlandırabilirsiniz 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

Sürümü pandas 0.24.0+mümkün parametre kullanın indexve 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

Dizin ve sütun adlarını kaldırmak, şu şekilde ayarlanması anlamına gelir 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

Yalnızca MultiIndexdizinde ise:

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

Dizin ve sütun adlarını kaldırmak, şu şekilde ayarlanması anlamına gelir 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

İçin MultiIndexindeksi ve sütunlarda ile gerekli çalışma olduğunu .namesyerine .nameve liste veya küpe ile seti:

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

Kontrol / ayar değerleri için çoğul gereklidir:

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

Dizin ve sütun adlarını kaldırmak, şu şekilde ayarlanması anlamına gelir 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

Ve @Jeff çözümü:

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

7
Bunun pandaların mevcut sürümleri için kabul edilmiş bir cevap olması gerektiğine inanıyorum
Thomas Fauskanger

2
Ayrıca kayda değer, phil başka bir önerdiği gibi df.index.rename('foo', inplace=True)bkz. Pandas.pydata.org/pandas-docs/stable/generated/…
Thomas Fauskanger

Veri çerçevesi olarak kullanılacak bir sözlük ithal ettik, bu nedenle dizin sütunu otomatik olarak Yok olarak 1-10 numaralı satırlarla ayarlandı. Ancak dizin olarak "adlar" sütununu atamak istiyorum. Ve mümkünse bunu çizim sırasında yapın. Bunu yapmak mümkün mü ve bunu çizerken bunu yapmak mümkün mü?
TokyoToo

28

df.index.name hile yapmalı.

Python'un dirnesne niteliklerini sorgulamanızı sağlayan bir işlevi vardır. dir(df.index)burada yardımcı oldu.


17

df.index.rename('foo', inplace=True)Dizin adını ayarlamak için kullanın .

Bu api, pandalar 0.13'ten beri mevcut gibi görünüyor .


1
Vay be ... zarif bir çözüm!
alfonso

13

Yeni bir satır oluşturmak istemez, ancak boş hücreye yerleştirirseniz şunu kullanın:

df.columns.name = 'foo'

Aksi takdirde kullanın:

df.index.name = 'foo'

1
Sadece sütun isimleri için bir isim buldum. Df.index.name ayarının size yeni bir seviye vermesine şaşmamalı. Teşekkür ederim!
Charles


1

Çoklu indekslerin çözümü jezrael'in siklopedik cevabının içinde, ancak yeni bir cevap gönderiyorum, bu yüzden bulmak biraz zaman aldı:

df.index.names çoklu dizinin adlarını verir (Dondurulmuş Liste olarak).


1

Sadece dizin sütun adları almak için df.index.namespandaların en son sürümü olarak hem tek bir Dizin hem de MultiIndex için çalışacaktır.

Dizin adları + sütun adları listesini almanın en iyi yolunu bulmaya çalışırken bunu bulan biri olarak, bu yanıtı yararlı bulurdum:

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

Bu, hiçbir dizin, tek sütunlu Dizin veya MultiIndex için işe yaramaz. Böyle basit bir işlem için gereksiz performans isabeti olan reset_index () çağrılmasını önler. Bunun için yerleşik bir yöntem olmadığına şaşırdım (karşılaştığım). Sanırım bu daha sık ihtiyaç duyuyorum çünkü veri çerçevesi dizin birincil / benzersiz bir anahtar ile eşleşir, ancak gerçekten sadece benim için başka bir sütun veritabanlarından veri kepenk.


1

Dizin adının ayarlanması, oluşturma sırasında da gerçekleştirilebilir:

pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name='Tag'))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.