データを読み込んだとき、列名がわかりにくかったり、日本語に変えたかったりすることがあります。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 でわかりやすい列名に変えておくと、その後の分析がスムーズになります。