重命名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
547951 次浏览

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

在Pandas 0.13及更高版本中,索引级别名称是不可变的(类型FrozenList),不能再直接设置。首先必须使用Index.rename()将新的索引级别名称应用到索引,然后使用DataFrame.reindex()将新索引应用到数据帧。例子:

熊猫版<0.13

df.index.names = ['Date']

对于熊猫版本>= 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)

对于较新的pandas版本

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

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

后者是必须的如果一个数据帧应该保留它的所有属性。

当前选择的答案没有提到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'])

enter image description here

这个DataFrame对于每个行索引和列索引都有一个级别。行索引和列索引都没有名称。让我们将行索引级别名称更改为'names'。

df.rename_axis('names')

enter image description here

rename_axis方法还可以通过更改axis参数来更改列级别名称:

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

enter image description here

如果使用某些列设置索引,则列名将成为新的索引级别名称。让我们将索引级别附加到原始DataFrame:

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

enter image description here

注意,原始索引没有名称。我们仍然可以使用rename_axis,但需要传递给它一个与索引层数相同长度的列表。

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

enter image description here

你可以使用None来有效地删除索引级别的名称。


系列工作原理类似,但有一些不同

让我们创建一个具有三个索引级别的Series

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

我们可以像使用DataFrames一样使用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创建Series时,此属性被设置为列名。

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

s.rename('FOOOOOD')


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

dataframe没有这个属性,如果这样使用,实际上会引发一个异常

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

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

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

是唯一一个为我做的工作(熊猫0.22.0) 如果没有inplace=True,在我的例子中没有设置索引的名称

你可以使用pandas.DataFrameindexcolumns属性。注意:列表的元素数量必须与行数/列数匹配。

#       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

单一指数:

 df.index.rename('new_name')

多重指数:

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

我们也可以在最新的熊猫中使用这个:

rename_axis < / > < / p >