今回は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つはindex
とcolumns
引数を使って操作を指定して明示的に指定する方法で、もう1つはmapper
で操作を指定したあと、axis
引数で指定する方法です。
axis
引数はバージョンによって入っていないこともあるのでindex
とcolumns
を使う方法の方が安全でしょう。
サンプルコード
まずは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
index
とcolumns
を使って別々に指定してみます。
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
inplace
をTrue
にすると元の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のときに使うオプションです。仮に、以下のファイルを使ってやってみます。
この中身をダウンロードして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
関数について解説しました。インデックスに対して関数が適用できるというのはかなり便利ですので是非使ってみてください。