前回の記事まではデータセットの値を変換する方法を紹介してきたが、軸のラベル名を変換することもできる。

まずはサンプルとなる簡単なデータフレームを用意しよう。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(12).reshape(3, 4),
                 index=['tokyo', 'osaka', 'fukuoka'])

#          0  1   2   3
# tokyo    0  1   2   3
# osaka    4  5   6   7
# fukuoka  8  9  10  11

データフレームのラベルを直接変更する例

インデックスラベルに小文字の都道府県名を設定したデータフレームだが、このラベル名を全て大文字に変換してみる。

upper = lambda x: x.upper()

df.index.map(upper)
# Index(['TOKYO', 'OSAKA', 'FUKUOKA'], dtype='object')

upper()関数は、対象となる文字列を全て大文字にする関数で、これをラムダ関数upperとして定義する。

そしてデータフレームのインデックスに対し、upperを引数としたmapメソッドを実行すると、上記のとおり大文字に変換されたラベル名のリストが結果として得られる。

最後にデータフレームのインデックスにこの結果を代入すれば、元のデータフレームオブジェクトのインデックスを直接変更することができる。

df.index = df.index.map(upper)

#          0  1   2   3
# TOKYO    0  1   2   3
# OSAKA    4  5   6   7
# FUKUOKA  8  9  10  11

データフレームのラベルを変更したコピーを作成する例

次に、データフレームのラベルを変更した結果のコピーを作成する例を紹介する。

この場合はrenameメソッドを使うと良い。

df2 = df.rename(index=str.upper)

print(df)
#          0  1   2   3
# tokyo    0  1   2   3
# osaka    4  5   6   7
# fukuoka  8  9  10  11

print(df2)
#          0  1   2   3
# TOKYO    0  1   2   3
# OSAKA    4  5   6   7
# FUKUOKA  8  9  10  11

renameメソッドは、ディクショナリを使うと特定のラベルのみを変換対象とすることもできる。

df2 = df.rename(index={'osaka': 'OSAKA'})
#          0  1   2   3
# tokyo    0  1   2   3
# OSAKA    4  5   6   7
# fukuoka  8  9  10  11

また、renameメソッドでもinplaceオプションにTrueを設定すれば、元のオブジェクトを直接上書きすることもできる。

df.rename(index={'osaka': 'OSAKA'}, inplace=True)
#          0  1   2   3
# tokyo    0  1   2   3
# OSAKA    4  5   6   7
# fukuoka  8  9  10  11