重命名Pandas数据帧索引

2024-05-18 14:21:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

Tags: 文件csvin版本dfreaddataindex
3条回答

rename方法为应用于indexvalues
要重命名为索引级别的名称:

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

当前选择的答案没有提到可用于重命名索引和列级别的rename_axis方法。


在重命名索引级别时,Pandas有一些古怪之处。还有一个新的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

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

df.rename_axis('names')

enter image description here

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

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

enter image description here

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

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有效地删除索引级别名称。


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

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

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类似于我们对数据帧的使用

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

数据帧没有这个属性,如果像这样使用,infact将引发一个异常

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

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

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

对于熊猫版<;0.13

df.index.names = ['Date']

对于熊猫版>;=0.13

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

相关问题 更多 >

    热门问题