重命名Pandas DataFrame索引

我有一个没有标题的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'] 

考虑这个问题的好方法是列和索引是相同types的对象( Index或多MultiIndex ),并且可以通过转置来交换这两个对象。

这有点令人困惑,因为索引名与列有相似的含义,所以这里有更多的例子:

 In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC')) In [2]: df Out[2]: ABC 0 1 2 3 1 4 5 6 In [3]: df1 = df.set_index('A') In [4]: df1 Out[4]: BC A 1 2 3 4 5 6 

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

 In [5]: df1.rename(index={1: 'a'}) Out[5]: BC 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 BC index 1 2 3 4 5 6 

在Pandas版本0.13及更高版本中,索引级别名称是不可变的(typesFrozenList ),不能再直接设置。 您必须首先使用Index.rename()将新的索引级别名称应用于索引,然后使用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) 

当前select的答案没有提及可以用来重命名索引和列级别的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来有效地删除索引级别名称。


系列工作类似,但有一些差异

我们来创build一个有三个索引级别的系列

 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的额外元数据。 从DataFrame创buildSeries时,此属性设置为列名称。

我们可以将string名称传递给rename方法来更改它

 s.rename('FOOOOOD') state color Jane NY blue Steak Nick TX green Lamb Aaron FL red Mango Name: FOOOOOD, dtype: object 

DataFrames没有这个属性,事实上会引发一个exception,如果这样使用

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

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

对于较新的pandas版本

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

要么

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

如果一个数据框应该保留所有的属性,后者是必需的