重命名 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

原文由 Mattijn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 709
2 个回答

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

可以看到index上的rename,可以把 改成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

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 Ted Petrou 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏