簡體   English   中英

重命名 Pandas DataFrame 索引

[英]Rename Pandas DataFrame Index

我有一個沒有標題的 csv 文件,帶有 DateTime 索引。 我想重命名索引和列名,但使用 df.rename() 只重命名列名。 漏洞? 我在 0.12.0 版本

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

rename方法采用適用於索引的索引字典。
您想重命名為索引級別的名稱:

df.index.names = ['Date']

考慮這個問題的一個好方法是列和索引是相同類型的對象( IndexMultiIndex ),您可以通過轉置來交換兩者。

這有點令人困惑,因為索引名稱與列的含義相似,因此這里有更多示例:

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

您可以在索引上看到重命名,可以將更改為 1:

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

重命名關卡名稱時:

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

注意:此屬性只是一個列表,您可以將重命名為列表理解/映射。

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

當前選擇的答案沒有提到可用於重命名索引和列級別的rename_axis方法。


在重命名索引級別時,Pandas 有一些古怪之處。 還有一個新的 DataFrame 方法rename_axis可用於更改索引級別名稱。

我們來看一個DataFrame

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'])

在此處輸入圖片說明

此 DataFrame 為每個行和列索引都有一個級別。 行和列索引都沒有名稱。 讓我們將行索引級別名稱更改為“名稱”。

df.rename_axis('names')

在此處輸入圖片說明

rename_axis方法還可以通過更改axis參數來更改列級別名稱:

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

在此處輸入圖片說明

如果使用某些列設置索引,則列名將成為新的索引級別名稱。 讓我們將索引級別附加到原始 DataFrame 中:

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

在此處輸入圖片說明

請注意原始索引如何沒有名稱。 我們仍然可以使用rename_axis但需要向它傳遞一個與索引級別數相同長度的列表。

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

在此處輸入圖片說明

您可以使用None有效地刪除索引級別名稱。


系列工作類似但有一些差異

讓我們創建一個具有三個索引級別的系列

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_axis一樣使用 rename_axis

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

請注意,在名為Name的 Series 下面有一個額外的元數據。 從 DataFrame 創建系列時,此屬性設置為列名稱。

我們可以將字符串名稱傳遞給rename方法來更改它

s.rename('FOOOOOD')

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

DataFrames 沒有這個屬性,如果像這樣使用,實際上會引發異常

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

在 pandas 0.21 之前,您可以使用rename_axis重命名索引和列中的值。 它已被棄用,所以不要這樣做

對於較新的pandas版本

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

或者

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

如果數據框應保留其所有屬性,則需要后者

在 Pandas 0.13 及更高版本中,索引級別名稱是不可變的(類型FrozenList )並且不能再直接設置。 您必須首先使用Index.rename()將新的索引級別名稱應用於 Index,然后使用DataFrame.reindex()將新索引應用於 DataFrame。 例子:

對於 Pandas 版本 < 0.13

df.index.names = ['Date']

對於 Pandas 版本 >= 0.13

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

您還可以使用Index.set_names如下:

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

如果您想使用相同的映射來重命名列和索引,您可以執行以下操作:

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)

對於單一索引:

 df.index.rename('new_name')

對於多索引:

 df.index.rename(['new_name','new_name2'])

我們也可以在最新的熊貓中使用它:

重命名軸

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

是唯一為我做這項工作的人(熊貓 0.22.0)。
如果沒有 inplace=True,在我的情況下沒有設置索引的名稱。

您可以使用pandas.DataFrame indexcolumns屬性。 注意:列表的元素數必須與行/列數匹配。

#       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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM