[英]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']
考慮這個問題的一個好方法是列和索引是相同類型的對象( Index
或MultiIndex
),您可以通過轉置來交換兩者。
這有點令人困惑,因為索引名稱與列的含義相似,因此這里有更多示例:
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
index
和columns
屬性。 注意:列表的元素數必須與行/列數匹配。
# 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.