Date Modified Tags pandas / python

Python用データ分析ライブラリpandasDataFrameの列(カラム)の名前を変える方法について、まとめました。

追記

  • 記事の内容をpandas 1.0.xに対応させました。

カラム名(列名)の変更には、大きく分けて3通りの方法があります。

  1. ディクショナリーを使う方法
  2. 関数を使う方法
  3. リストで上書きする方法

ここではそれぞれのやり方について、メリットとデメリットと併せて紹介します。

1.   前提としている環境

本記事では、下記を前提としています。

  • Python : Ver.3.8
  • pandas : Ver.1.0.x

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通りの方法について、順に説明します。

  1. ディクショナリーを使う方法
  2. 関数を使う方法
  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回だけ実行するような場合は、リストで上書きする方法が簡単で手軽です。

しかし、スクリプトを書いて様々なデータに対して何度も実行するような場合は、想定外のデータが来た時にデータを壊してしまわないように、ディクショナリーを使う方法関数を使う方法を取った方が良いでしょう。