Pandalar DataFrame Dizinini Yeniden Adlandır


142

DateTime dizini ile, başlıksız bir csv dosyası var. Dizin ve sütun adını yeniden adlandırmak istiyorum, ancak df.rename () ile yalnızca sütun adı yeniden adlandırılır. Hata? 0.12.0 sürümündeyim

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

5
2017'de bu soruya gelenler için , yöntemin çok ayrıntılı bir açıklamasını görmek için aşağıdaki cevabı kontrol edinrename_axis .
Ted Petrou

3
Ve aşağıda tamamını iyi bir cevap okuma rahatsız olamaz olanlar için, daha sonra hızlı bir çözümdür df.rename_axis("Date", axis='index', inplace=True)belgeler uyarınca pandas.pydata.org/pandas-docs/stable/generated/... veyadf.index.names = ['Date']
tommy.carstensen

Yanıtlar:


237

renameYöntem endeksi için geçerlidir endeksi için bir sözlük alır değerler .
Dizin düzeyinin adıyla yeniden adlandırmak istiyorsunuz:

df.index.names = ['Date']

Bunu düşünmenin iyi bir yolu, sütunların ve dizinin aynı türde nesne ( Indexveya MultiIndex) olmasıdır ve ikisini devrik olarak değiştirebilirsiniz.

Dizin adları sütunlara benzer bir anlama sahip olduğundan, bu biraz kafa karıştırıcıdır, bu yüzden daha fazla örnek:

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

Dizinde 1 değerini değiştirebilecek yeniden adlandırma görebilirsiniz :

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

Seviye adlarını yeniden adlandırırken:

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

Not: Bu özellik sadece bir listedir ve yeniden adlandırma işlemini bir liste anlama / harita olarak yapabilirsiniz.

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6

2
Mükemmel cevap. Sadece nazik bir hatırlatma olmadan "inplace =True", df1.renamehiçbir şeyi gerçekten değiştirmeyecek.
Sarah

63

Şu anda seçili yanıt rename_axis, dizin ve sütun düzeylerini yeniden adlandırmak için kullanılabilecek yöntemden bahsetmiyor .


Endeks seviyelerini yeniden adlandırmaya gelince Pandalar biraz tuhaflığa sahiptir. rename_axisDizin düzeyi adlarını değiştirmek için yeni bir DataFrame yöntemi de vardır.

Bir DataFrame'e bakalım

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

resim açıklamasını buraya girin

Bu DataFrame, satır ve sütun dizinlerinin her biri için bir düzey içerir. Hem satır hem de sütun dizininin adı yoktur. Satır dizini düzey adını 'adlar' olarak değiştirelim.

df.rename_axis('names')

resim açıklamasını buraya girin

rename_axisYöntem ayrıca, değiştirerek kolon seviyesi adları değiştirme yeteneğine sahip axisparametre:

df.rename_axis('names').rename_axis('attributes', axis='columns')

resim açıklamasını buraya girin

Dizini sütunlardan bazılarıyla ayarlarsanız, sütun adı yeni dizin düzeyi adı olur. Orijinal DataFrame'imize dizin düzeylerini ekleyelim:

df1 = df.set_index(['state', 'color'], append=True)
df1

resim açıklamasını buraya girin

Orijinal dizinin nasıl adı olmadığına dikkat edin. Yine de kullanabiliriz, rename_axisancak bunu, dizin düzeyi sayısıyla aynı uzunlukta bir liste geçirmemiz gerekir.

df1.rename_axis(['names', None, 'Colors'])

resim açıklamasını buraya girin

NoneDizin düzeyi adlarını etkili bir şekilde silmek için kullanabilirsiniz .


Seri benzer şekilde çalışır ancak bazı farklılıklarla

Üç dizin düzeyine sahip bir Seri oluşturalım

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

rename_axisDataFrames ile yaptığımız gibi benzer şekilde kullanabiliriz

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

Dizinin altında fazladan bir meta veri parçası olduğuna dikkat edin Name. Bir DataFrame'den Seri oluştururken, bu özellik sütun adına ayarlanır.

Bir dize adını değiştirmek için renameyönteme aktarabiliriz

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

DataFrames bu özelliğe sahip değildir ve böyle kullanılırsa infact bir istisna oluşturur

df.rename('my dataframe')
TypeError: 'str' object is not callable

Pandalar 0.21'den önce rename_axis, dizin ve sütunlardaki değerleri yeniden adlandırmak için kullanılmış olabilirdiniz . Kullanımdan kaldırıldı, bu yüzden yapma


1
Eğer takas mı df1 = df.set_index(['state', 'color'], append=True)ile df1.rename_axis(['names', None, 'Colors'])?
salhin

"Nick" i "Nicolas" olarak yeniden adlandırmak istersem ne olur? Ben "panda endeksi yeniden adlandır" googled ve burada sona erdi aradığım şeydi. EDIT: Oh bekleyin, kabul edilen cevap açıklıyor, ilk başta benim için açık değildi.
Ben Farmer

Güzel, zincirleme görevlerde kullanılabilecek tek cevap bu!
IanS

19

Daha yeni pandassürümler için

df.index = df.index.rename('new name')

veya

df.index.rename('new name', inplace=True)

Bir veri çerçevesinin tüm özelliklerini koruması gerekiyorsa ikincisi gereklidir .


18

Panda sürüm 0.13 ve daha büyük sürümlerde, dizin düzeyi adları değiştirilemez (tür FrozenList) ve artık doğrudan ayarlanamaz. Önce Index.rename()yeni dizin düzeyi adlarını Dizine DataFrame.reindex()uygulamak için, ardından da yeni dizini DataFrame'e uygulamak için kullanın . Örnekler:

Pandalar sürüm <0.13 için

df.index.names = ['Date']

Pandalar sürümü için> = 0.13

df = df.reindex(df.index.rename(['Date']))

9
Doğru değil! Pandalar versiyonumda (0.13.1) df.index.names = ['foo'] iyi çalışıyor!
LondonRob

5
@LondonRob - `df.index.names = ['foo']` 'nun benim için Pandalar 0.14 ile de çalıştığını fark ettiğiniz için teşekkür ederiz. Görünüşe göre bu sadece kısa bir süre kırıldı ve test ettiğimde dahil edildi.
David Smith

1
İkisinden biri indexveya columndoğrudan için isim ayarlamak her ikisi de benim için değişiyor (Panda 0.19'da), ancak bu yöntemle değişmiyor.
FooBar

8

Ayrıca Index.set_namesaşağıdaki gibi kullanabilirsiniz :

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64

2
Bu bir işe yarayabilir multiIndexmi? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])O adlandırmak mümkün mü NoneTo measures?
ctrl-alt-delete

2

Hem sütunları hem de dizini yeniden adlandırmak için aynı eşlemeyi kullanmak istiyorsanız şunları yapabilirsiniz:

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)

0
df.index.rename('new name', inplace=True)

Benim için işi yapan tek kişi (pandalar 0.22.0).
İnplace = True olmadan, benim durumumda dizin adı ayarlanmamış.


0

indexve columnsözelliklerini kullanabilirsiniz pandas.DataFrame. NOT: listedeki elemanların sayısı satır / sütun sayısıyla eşleşmelidir.

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
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.