pandas で列名を変更する(rename)

データを読み込んだとき、列名がわかりにくかったり、日本語に変えたかったりすることがあります。pandas の rename メソッドを使えば、列名を簡単に変更できます。

基本的な使い方

rename に辞書を渡して、変更前と変更後の列名を指定します。

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': ['a', 'b', 'c']
})

df = df.rename(columns={'col1': 'id', 'col2': 'name'})
print(df)

辞書のキーが変更前、値が変更後の列名です。指定しなかった列はそのまま残ります。

複数の列を一度に変更する

辞書に複数のペアを入れれば、一度に変更できます。

df = df.rename(columns={
    'old_name1': 'new_name1',
    'old_name2': 'new_name2',
    'old_name3': 'new_name3'
})

列名を直接上書きする

全ての列名を変更したい場合は、columns 属性にリストを代入するほうが簡単です。

df = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
})

df.columns = ['id', 'value']
print(df)

この方法は列数とリストの要素数が一致している必要があります。

列名を一括変換する

rename には関数を渡すこともできます。全ての列名に同じ変換を適用したいときに便利です。

# 全ての列名を小文字に
df = df.rename(columns=str.lower)

# 全ての列名を大文字に
df = df.rename(columns=str.upper)

# 列名の前後の空白を削除
df = df.rename(columns=str.strip)

ラムダ式を使えば、より複雑な変換も可能です。

# 列名にプレフィックスを追加
df = df.rename(columns=lambda x: 'col_' + x)

# 列名のスペースをアンダースコアに変換
df = df.rename(columns=lambda x: x.replace(' ', '_'))

行のインデックスを変更する

rename は行のインデックスも変更できます。index パラメータを使います。

df = pd.DataFrame({
    'value': [10, 20, 30]
}, index=['a', 'b', 'c'])

df = df.rename(index={'a': 'first', 'b': 'second'})
print(df)

set_axis で一括変更する

set_axis を使うと、列名やインデックスをリストで一括設定できます。

df = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
})

# 列名を変更
df = df.set_axis(['id', 'value'], axis=1)

# インデックスを変更
df = df.set_axis(['row1', 'row2'], axis=0)

df.columns = [...] と似ていますが、メソッドチェーンで使える点が便利です。

result = (df
    .rename(columns={'A': 'id'})
    .set_axis(['row1', 'row2'], axis=0))

列名の変更はデータの可読性を大きく左右します。読み込んだ直後に rename でわかりやすい列名に変えておくと、その後の分析がスムーズになります。