今回はDataFrameのインデックスやカラムに使われているラベル名を変更するrename関数についてまとめていきます。DataFrameについては以下の記事を参考にしてください。

Pandasのデータを格納するオブジェクトDataFrameを理解する /features/pandas-dataframe.html

rename関数

APIドキュメント

rename関数のAPIドキュメントは以下のとおりです。

pandas.DataFrame.rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False)

params:

パラメータ名 概要
mapper 辞書もしくは
関数
関数を指定すると各ラベルに対して行う操作を指定します。辞書型のときはキー(key)が入れ替える前の値でバリュー(value)が入れ替えたあとの値になります。
index 辞書もしくは
関数
mapperと同様のことをindexに対して行います。
columns 辞書もしくは
関数
mapperと同様のことをcolumnsに対して行います。
axis 0,1
もしくは’index’,’columns’
mapperで指定された操作をどの軸方向に対して行うかを指定します。0かindexであればindexに1かcolumnsであればcolumnsに対して行います。
copy bool値 初期値 True
インデックスとデータの値のコピー作成するかどうか指定します。
inplace bool値 初期値 False
Trueのとき操作の対象となっているDataFrameオブジェクトの中身を変更します。このときcopy引数の値は無視されます。
level intまたは
level(階層)の名前
MultiIndexのときどの階層(level)のIndexオブジェクトに対して操作を行うか指定します。

returns:

renameされたDataFrame

APIドキュメントを見てみると、インデックスとカラム、どちらを対象にするかを指定する方法が2つあることが分かります。

1つはindexcolumns引数を使って操作を指定して明示的に指定する方法で、もう1つはmapperで操作を指定したあと、axis引数で指定する方法です。

axis引数はバージョンによって入っていないこともあるのでindexcolumnsを使う方法の方が安全でしょう。

サンプルコード

まずはmapperを指定してみましょう。デフォルトだとインデックスのラベルを変換します。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=['a','b','c'])

In [3]: df
Out[3]:
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

In [4]: df.rename({0:11})
Out[4]:
    a  b  c
11  1  2  3
1   4  5  6
2   7  8  9

axisを指定することでカラムのラベルを変更可能です。Pandasのバージョンによってはこの引数は含まれていないので注意してください。

0.21以降なら入っているはずです。

In [5]: df.rename({0:11},axis=0)
Out[5]:
    a  b  c
11  1  2  3
1   4  5  6
2   7  8  9

In [6]: df.rename({'a':'aa'},axis=1)
Out[6]:
   aa  b  c
0   1  2  3
1   4  5  6
2   7  8  9

In [7]: df.rename({'a':'aa'},axis='columns')
Out[7]:
   aa  b  c
0   1  2  3
1   4  5  6
2   7  8  9

indexcolumnsを使って別々に指定してみます。

In [8]: df.rename(index={0:11},columns={"a":"aa"})
Out[8]:
    aa  b  c
11   1  2  3
1    4  5  6
2    7  8  9

このように同時にインデックスとカラムに対して実行できます。
関数を使って操作を指定してみましょう。
lambda関数を使うのが手軽でしょう。

In [9]: df.rename(lambda x: x*2)
Out[9]:
   a  b  c
0  1  2  3
2  4  5  6
4  7  8  9

In [12]: df.rename(columns= lambda x: x.upper()) # 大文字にする
Out[12]:
   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9

copyをFalseにすると生成されたDataFrameの値の中身の変更が元のDataFrameにも反映されます。ここでは、dfの値も変わっていることに注意してみてください。

In [15]: a = df.rename(index={1:11})

In [16]: b = df.rename(index={1:11},copy=False)

In [17]: b.iloc[1,1] = 25

In [18]: a
Out[18]:
    a  b  c
0   1  2  3
11  4  5  6
2   7  8  9

In [19]: b
Out[19]:
    a   b  c
0   1   2  3
11  4  25  6
2   7   8  9

In [20]: df
Out[20]:
   a   b  c
0  1   2  3
1  4  25  6
2  7   8  9

In [21]: a.iloc[0,1] = 33

In [22]: a
Out[22]:
    a   b  c
0   1  33  3
11  4   5  6
2   7   8  9

In [23]: df
Out[23]:
   a   b  c
0  1   2  3
1  4  25  6
2  7   8  9

inplaceTrueにすると元のDataFrameの変更が反映されます。

In [24]: df.rename(columns={'b':'bb', 'c':'C'}, inplace=True)

In [25]: df
Out[25]:
   a  bb  C
0  1   2  3
1  4  25  6
2  7   8  9

levelについてですが、MultiIndexのときに使うオプションです。仮に、以下のファイルを使ってやってみます。

sample_index.csv

この中身をダウンロードしてread_csvで読み込んでも良いですし、手動で直接DataFrameを作成しても構いません。

In [26]: df = pd.read_csv('sample_index.csv')

In [27]: df
Out[27]:
   age gender    name   state
0   17      M   Tarou   Tokyo
1   18      F  Hanako   Osaka
2   18      M  Kakeru   Osaka
3   17      F  Manaka  Nagoya
4   19      M  Tomoki   Chiba
5   17      F     Rin  Hakata

このデータをMultiIndexを持つDataFrameに変換します。今回はset_index関数を使います。

In [29]: multi = df.set_index(['state','gender'])

In [30]: multi
Out[30]:
               age    name
state  gender             
Tokyo  M        17   Tarou
Osaka  F        18  Hanako
       M        18  Kakeru
Nagoya F        17  Manaka
Chiba  M        19  Tomoki
Hakata F        17     Rin

ではこのIndexで、genderの方にrename関数を適用したいときはlevel=1とします。

一番左側のIndexオブジェクトがlevel=0になり、右側にいくにつれてlevelの値が増加します。 一番右側を指定したいときはlevel=-1とすればよいです。ちなみにこれがデフォルトの値になっています。

In [33]: multi.rename(index={"M":"Male","F":"Female"}, level=1)
Out[33]:
               age    name
state  gender             
Tokyo  Male     17   Tarou
Osaka  Female   18  Hanako
       Male     18  Kakeru
Nagoya Female   17  Manaka
Chiba  Male     19  Tomoki
Hakata Female   17     Rin

In [35]: multi.rename(index=lambda x:x.upper(),level=0)
Out[35]:
               age    name
state  gender             
TOKYO  M        17   Tarou
OSAKA  F        18  Hanako
       M        18  Kakeru
NAGOYA F        17  Manaka
CHIBA  M        19  Tomoki
HAKATA F        17     Rin

まとめ

今回はインデックスの値を個別に変換するrename関数について解説しました。インデックスに対して関数が適用できるというのはかなり便利ですので是非使ってみてください。

参考