Date Modified Tags pandas / python

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

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

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

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

1.   前提としている環境

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

  • Python : Ver.3.6
  • pandas : Ver.0.23.4

2.   準備

まず、pandasをpdという名前でインポートしておきます。

1
import pandas as pd

次のようなDataFrameを例にあげて解説します。

2
3
4
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.   ディクショナリーを使う方法

3.1.1.   メリット

  • カラム名の順番を気にしなくて良い
  • 変更前と変更後をペアで定義するので分かり易い

3.1.2.   デメリット

  • カラム名が多いとディクショナリーを定義するのが大変

3.1.3.   やり方

変更前の名前をキーに、変更後の名前を値に持つディクショナリーを、DataFrame.renameメソッドのcolumns引数に渡して変更します[1][2][3][4][5][6][7][9][10][11][12]

例えばカラム名を英語にする場合は、このようになります。カラム名が変更されたDataFrameが返ってきます。

5
6
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を渡す必要があります。

7
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を使え」という旨の警告が表示されます。

8
df.rename_axis(mapper=dic, axis=1)
FutureWarning: Using 'rename_axis' to alter labels is deprecated. Use '.rename' instead
apple grapes watermelon
0 9 3 4
1 2 4 6
2 8 2 1

DataFrame.renameのaxis引数に、1ではなく'columns'を渡しても同じ結果になります。

9
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は書き換えられません)

10
11
12
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関数を使って全ての文字を大文字に変換しています。

13
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関数を使います。

14
df.rename(columns=lambda x: x.capitalize())
Apple Grapes Watermelon
0 9 3 4
1 2 4 6
2 8 2 1

もちろん、lambda関数ではなく自分で定義した関数を渡すこともできます。

15
16
17
18
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オブジェクトが入っています。

19
df.columns
Index(['apple', 'grapes', 'watermelon'], dtype='object')

新たなカラム名を持ったリストを作って代入します。リストの要素数とカラム数は、一致している必要があります。

20
21
df.columns = ['みかん', 'れもん', 'ゆず']
df
みかん れもん ゆず
0 9 3 4
1 2 4 6
2 8 2 1