重命名熊猫DataFrame索引


142

我有一个没有标头的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

5
对于2017年遇到此问题的人,请在下面查看此答案以查看有关该rename_axis方法的非常详细的说明。
泰德·彼得鲁

3
对于那些不愿阅读下面完整答案的人,快速解决方案是df.rename_axis("Date", axis='index', inplace=True)根据文档pandas.pydata.org/pandas-docs/stable/genic / ...df.index.names = ['Date']
tommy.carstensen

Answers:


237

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

2
好答案。提醒您一点"inplace =True"df1.rename如果没有,则不会真正改变任何内容。
莎拉,

63

当前选择的答案未提及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像使用DataFrames一样使用

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创建系列时,此属性设置为列名。

我们可以将字符串名称传递给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

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


1
你应该换df1 = df.set_index(['state', 'color'], append=True)df1.rename_axis(['names', None, 'Colors'])
salhin's

如果我想将“ Nick”重命名为“ Nicolas”怎么办?这就是我在Google上搜索“重命名熊猫索引”并最终到达此处时所要寻找的东西。编辑:哦,等等,公认的答案确实说明了这一点,起初对我来说并不明显。
Ben Farmer

很好,这是可以在链接分配中使用的唯一答案!
IanS

19

对于较新的pandas版本

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

要么

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

如果数据框应保留其所有属性,则需要后者


18

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

对于熊猫版本<0.13

df.index.names = ['Date']

对于熊猫版本> = 0.13

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

9
不对!在我的Pandas版本(0.13.1)中,df.index.names = ['foo']正常!
LondonRob 2014年

5
感谢您注意到@LondonRob-`df.index.names = ['foo']`也适用于Pandas 0.14。显然,这只是短暂地打破了,并在我测试时包括在内。
大卫·史密斯

1
为我设置任何一个名称indexcolumn直接设置名称都会同时更改(在Pandas 0.19上),但使用此方法不会更改。
FooBar

8

您还可以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

2
这可以工作multiIndex吗? 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])是否可以将重命名Nonemeasures
ctrl-alt-delete

2

如果要使用相同的映射来重命名列和索引,则可以执行以下操作:

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)

是唯一为我完成工作的人(熊猫0.22.0)。
如果没有inplace = True,则在我的情况下不会设置索引名称。


0

您可以使用index和的columns属性pandas.DataFrame。注意:列表元素的数量必须与行/列的数量匹配。

#       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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.