Python 重命名数据帧索引

Python 重命名数据帧索引,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个没有标题的csv文件,带有日期时间索引。我想重命名索引和列名,但使用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

我有一个没有标题的csv文件,带有日期时间索引。我想重命名索引和列名,但使用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 [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()
将新索引应用于DataFrame。示例:

对于熊猫版<0.13

df.index.names = ['Date']
df = df.reindex(df.index.rename(['Date']))
熊猫版>=0.13

df.index.names = ['Date']
df = df.reindex(df.index.rename(['Date']))
您还可以按如下方式使用:

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
版本 或


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

当前选择的答案未提及可用于重命名索引和列级别的
重命名轴方法


熊猫在重新命名索引级别时有些古怪。还有一种新的数据帧方法
重命名\u axis
可用于更改索引级别名称

让我们看一看数据帧

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

此数据帧的行和列索引各有一个级别。行索引和列索引都没有名称。让我们将行索引级别名称更改为“名称”

df.rename_axis('names')

rename\u axis
方法还可以通过更改
axis
参数来更改列级名称:

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

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

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\u 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
的系列下面还有一段额外的元数据。从数据帧创建序列时,此属性设置为列名

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

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object
DataFrames没有此属性,如果像这样使用,则infact将引发异常

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.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
对于单个索引:

 df.index.rename('new_name')
对于多索引:

 df.index.rename(['new_name','new_name2'])
我们也可以在最新版本中使用:


不正确!在我的Pandas版本(0.13.1)中,df.index.names=['foo']工作正常!感谢您注意到@LondonRob-`df.index.names=['foo']`也适用于熊猫0.14。显然,这只是在我测试它时被短暂地打断并包括在内。直接为
索引
设置名称对我来说都在改变(在Pandas 0.19上),但不使用此方法。这对
多索引
有效吗<代码>多索引(级别=['A','B','C','D','E','F'],['Y','Z']],标签=[[0,0,1,1,2,2,3,3,4,4,5,5],[0,1,0,1,0,1,0,1,0,1,0,0,1,0,1],名称=['Portfolio',无])
是否可以将
重命名为
度量值
?对于2017年提出此问题的人,要查看关于
rename\u axis
方法的非常详细的解释,对于那些不想阅读下面完整的好答案的人,快速解决方案是
df.rename\u axis(“Date”,axis='index',inplace=True)
根据文档或
df.index.names=['Date']
是否应该交换
df1=df.set\u index(['state','color'],append=True)
带有
df1。重命名轴(['names',None',Colors'])
?如果我想将“Nick”重命名为“Nicolas”,该怎么办?这就是我在谷歌搜索“重命名熊猫索引”时所寻找的编辑:哦,等等,接受的答案确实解释了这一点,一开始我并不清楚。很好,这是链接作业中唯一可以使用的答案!重命名索引和列时无需调用它两次,您可以使用args:
df.rename\u axis处理一次(index='names',columns='attributes')
回答得很好。只是温柔地提醒一下,如果没有
“inplace=True”
df1.rename
,它实际上不会改变任何东西。@Sarah你提到的神奇的一行为什么会做出改变?如果这样做,你只会得到一个重命名的索引作为返回,但数据框不会改变。
 df.index.rename(['new_name','new_name2'])