HOWTO · Pandas
Pandas DataFrame で列の名前を変更する方法
この記事では、pandas の DataFrame で列名を変更する方法を3つ紹介します。全列を置き換える方法と一部の列だけを変更する方法を説明します。
このページの内容
Pandas で DataFrame の列名を変更するには、DataFrame.columns に列名の一覧をすべて代入する方法、DataFrame.rename() で変更する列だけを対応付ける方法、DataFrame.set_axis() で列名全体を置き換える方法があります。すべての列を変更するのか、一部だけを変更するのかに応じて選びましょう。
列名の変更方法を選ぶ
変更前と変更後の名前が分かっている列が少数なら、DataFrame.rename() を使います。対応付けていない列名はそのまま残るため、一部の列だけを変更したい場合に便利です。すべての列に新しい名前を付けるなら、DataFrame.columns または DataFrame.set_axis() を使います。どちらの方法でも、新しい名前の数を DataFrame の列数と一致させる必要があります。
DataFrame.columns ですべての列名を変更する
columns 属性にリストを直接代入すると、すべての列名を一度に置き換えられます。例では、変更前の列名 ['Name', 'Age', 'Marks'] を本文中に示し、それぞれに新しい名前を割り当てます。次の出力に表示されるのは変更後の列名 ['Name', 'Age', 'Roll_no'] だけです。コードと出力に含まれる列名のラベルは英語のままです。
次の例を実行してください。
import pandas as pd
scores = pd.DataFrame(
[["John", 20, 45], ["Peter", 21, 62], ["Scot", 25, 68]],
columns=["Name", "Age", "Marks"],
)
scores.columns = ["Name", "Age", "Roll_no"]
print(list(scores.columns))
['Name', 'Age', 'Roll_no']
この方法は直接的ですが、変更しない列名も含め、すべての名前を明示する必要があります。列数の多い DataFrame では手間がかかります。また、新しいリストには既存の列ごとに1つずつ名前が必要です。列数と一致しないリストは、pandas で列名を割り当てられません。
DataFrame.rename() で一部の列名を変更する
columns に辞書を渡し、各キーに既存の列名、各値に変更後の名前を指定します。例では Marks だけを変更し、ほかの列名はそのままにします。コードと出力に含まれる列名のラベルは英語のままです。デフォルトでは DataFrame.rename() は新しい DataFrame を返し、元の DataFrame は変更しないため、戻り値を受け取ってください。
次の例を実行してください。
import pandas as pd
scores = pd.DataFrame([["John", 20, 45]], columns=["Name", "Age", "Marks"])
renamed = scores.rename(columns={"Marks": "Score"})
print(list(renamed.columns))
['Name', 'Age', 'Score']
別の方法として、inplace=True を指定すると既存の DataFrame に対応付けが適用されます。この場合、呼び出しは None を返すため、その戻り値を DataFrame に代入しないでください。一部の列だけを変更するなら、辞書で対応付ける方法が分かりやすく、すべての列名を並べたリストを管理する必要もありません。
DataFrame.set_axis() で列名全体を置き換える
DataFrame.set_axis() も、列名全体を置き換える方法です。すべての列名を含むリストを渡し、列軸を指定します。デフォルトの動作では、返された DataFrame を代入します。コードと出力に含まれる列名のラベルは英語のままです。
次の例を実行してください。
import pandas as pd
scores = pd.DataFrame([["John", 20, 45]], columns=["Name", "Age", "Marks"])
renamed = scores.set_axis(["Name", "Age", "Score"], axis="columns")
print(list(renamed.columns))
['Name', 'Age', 'Score']
直接代入する場合と同様に、リストにはすべての列名が必要です。新しい名前のリストが別の値として用意されている場合や、置き換えをメソッドチェーンに組み込みたい場合に便利です。DataFrame.rename() のように、変更する列だけを変更前後の名前で対応付ける機能はありません。
結果を確認して適切な方法を選ぶ
変更後に renamed.columns を確認するか、list(renamed.columns) を出力して、意図した列名になっているか確かめましょう。この確認は、後続のコードで列名を参照する前にも役立ちます。名前の入力ミスや古い名前を使うと、変更後の列名と一致しません。
まとめると、一部の列だけを変更するなら DataFrame.rename() を使います。すべての列名を簡単に置き換えるなら DataFrame.columns、リストをメソッド呼び出しやチェーンに自然に組み込むなら DataFrame.set_axis() が適しています。どちらの全列置換方法でも、名前の数を確認し、DataFrame の列の順序に合わせてください。