Python用データ分析ライブラリpandasでDataFrameの列(カラム)の名前を変える方法について、まとめました。
追記
- 記事の内容をpandas 1.0.xに対応させました。
カラム名(列名)の変更には、大きく分けて3通りの方法があります。
ここではそれぞれのやり方について、メリットとデメリットと併せて紹介します。
目次
2. 準備
まず、pandasをpdという名前でインポートしておきます。
import pandas as pd
次のようなDataFrameを例にあげて解説します。
data = {'りんご': [9, 2, 8],
'ぶどう': [3, 4, 2],
'すいか': [4, 6, 1]}
df = pd.DataFrame(data=data)
df
りんご | ぶどう | すいか | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
3. DataFrameのカラム名を変更する3通りの方法
下記の3通りの方法について、順に説明します。
3.1. ディクショナリーを使う方法
3.1.1. メリット
- カラム名の順番を気にしなくて良い
- 変更前と変更後をペアで定義するので分かり易い
3.1.2. デメリット
- カラム名が多いとディクショナリーを定義するのが大変
3.1.3. やり方
変更前の名前をキーに、変更後の名前を値に持つディクショナリーを、DataFrame.renameメソッドのcolumns引数に渡して変更します[1][2][3][4][5][6][7][9][10][11][12]。
例えばカラム名を英語にする場合は、このようになります。カラム名が変更されたDataFrameが返ってきます。
dic = {'りんご': 'apple',
'ぶどう': 'grapes',
'すいか': 'watermelon'}
df.rename(columns=dic)
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
mapper引数に渡す場合は、axis引数に(カラムを意味する)1を渡す必要があります。
df.rename(mapper=dic, axis=1)
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
pandas ver.0.21.0以前は、DataFrame.rename_axisメソッドを使ってカラム名の変更をしていましたが、現在は「代わりに.renameを使え」という旨の例外が発生します。
df.rename_axis(mapper=dic, axis=1)
ValueError: Use .rename to alter labels with a mapper.
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
DataFrame.renameのaxis引数に、1ではなく'columns'を渡しても同じ結果になります。
df.rename(mapper=dic, axis='columns')
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
inplace引数にTrueを渡すと、DataFrameを直接書き換えられます。(何も渡さない、あるいはFalseを渡すとカラム名変更後のDataFrameを返すだけで、元のDataFrameは書き換えられません)
dic = {'りんご': 'apple',
'ぶどう': 'grapes',
'すいか': 'watermelon'}
df.rename(columns=dic, inplace=True)
df
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
3.2. 関数を使う方法
3.2.1. メリット
- 変更処理さえ定義できれば、カラム数が多くても大変じゃない
- 汎用的な変更処理を定義すれば、他のDataFrameにも流用できる
3.2.2. デメリット
- 変更処理を関数として定義しなくてはならない
3.2.3. やり方
現在のdfはこのようになっています。
apple | grapes | watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
DataFrame.renameメソッドのcolumns引数に変更処理を定義した関数を渡して変更します[1][3][7][9]。渡した関数の引数には、カラム名文字列がひとつひとつ渡されます。
ここではlambda関数を渡します。lambda関数の中では、str.upper関数を使って全ての文字を大文字に変換しています。
df.rename(columns=lambda x: x.upper())
APPLE | GRAPES | WATERMELON | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
1文字目だけを大文字にするなら、str.capitalize関数を使います。
df.rename(columns=lambda x: x.capitalize())
Apple | Grapes | Watermelon | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
もちろん、lambda関数ではなく自分で定義した関数を渡すこともできます。
def to_upper(s):
return s.upper()
df.rename(columns=to_upper)
APPLE | GRAPES | WATERMELON | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
3.3. リストで上書きする方法
3.3.1. メリット
- (ディクショナリーや関数を定義しなくても)一気に上書きできる
3.3.2. デメリット
- カラムの順序を把握しておかないといけない
- カラム数と同じ要素数のリストを用意しなくてはいけない
3.3.3. やり方
columnsプロパティにリストを代入して、丸ごとカラム名を上書きします[3][4][5][8][9][10][11][12]。
columnsプロパティには、Indexオブジェクトが入っています。
df.columns
Index(['apple', 'grapes', 'watermelon'], dtype='object')
新たなカラム名を持ったリストを作って代入します。リストの要素数とカラム数は、一致している必要があります。
df.columns = ['みかん', 'れもん', 'ゆず']
df
みかん | れもん | ゆず | |
---|---|---|---|
0 | 9 | 3 | 4 |
1 | 2 | 4 | 6 |
2 | 8 | 2 | 1 |
4. まとめ
iPython等のインタラクティブな環境で1回だけ実行するような場合は、リストで上書きする方法が簡単で手軽です。
しかし、スクリプトを書いて様々なデータに対して何度も実行するような場合は、想定外のデータが来た時にデータを壊してしまわないように、ディクショナリーを使う方法や関数を使う方法を取った方が良いでしょう。
5. 参考リンク
[1] | (1, 2) pandas のインデックス、カラムを rename で書きかえ-python | コード7区 |
[2] | Python データフレームの列名を変更 |
[3] | (1, 2, 3) pandas.DataFrameの行名・列名の変更 | note.nkmk.me |
[4] | (1, 2) python でデータフレームの列名を変更(列名指定) | 株式会社nehan |
[5] | (1, 2) pandas データフレームの行名・列名の参照と変更と追加 | 全人類がわかる統計学 |
[6] | pandas入門 column(列名) index(行名)の変更 - Python学習講座 |
[7] | (1, 2) Pandasのrename関数ででインデックスやカラム名を変更する - DeepAge |
[8] | pandasでcolumnsとindexの名前を変更する方法 - Oh! Yummy!! |
[9] | (1, 2, 3) python - Renaming columns in pandas - Stack Overflow |
[10] | (1, 2) Rename Multiple pandas Dataframe Column Names |
[11] | (1, 2) Renaming columns in Pandas |
[12] | (1, 2) How to change the name of specific column in Pandas Dataframe - tools - Data Science, Analytics and Big Data discussions |