この記事でわかること

  • Excelの表の列名から、前後の空白や全角の記号を取り除いてそろえる方法
  • pandasのrenameで、対応表に沿って列名を変える手順
  • 対応表の書きまちがいや、同じ名前の列ができたことに気づく方法
  • 列名をそろえた表を、別のExcelのファイルに保存する手順

人や部署ごとに作られたExcelの表では、同じ中身の列でも、見出しが「売上」「売上(円)」「 売上 」のように少しずつ違うことがあります。Pythonで読み込むと、見出しはそのまま列名になるため、文字が1つ違うだけで、列を取り出せなかったり、ほかの表とつなげなかったりします。ここでは、pandasで列名の空白と全角・半角をそろえ、対応表を使って決めた名前に変える手順を、架空の売上の表で動かした結果とあわせて紹介します。

renameなどの指定の意味は、2026年10月27日にpandasの公式の資料(APIリファレンスとユーザーガイド、3.1.0の版)を読んで確かめました。表は架空のもので、実在の人の名前や数字は使っていません。

先に結論: 空白と全角をそろえてから、対応表でrenameする

先に結論を書くと、列名は、前後の空白を消して全角の英数字・記号を半角にそろえてから、「前の名前: 新しい名前」の対応表をrenameに渡して変えます。 対応表の書きまちがいに気づけるように、errors="raise"を付けます。使う道具は、次の4つです。

道具 役割
columns.str.strip 前後の空白を消す
str.normalize 全角と半角をそろえる
rename 対応表で名前を変える
errors="raise" 無い名前で止める

列名の揺れが起きる理由

pandasのread_excelは、表のいちばん上の行を見出しとして読み、その文字をそのまま列名にします。見出しのセルに空白が入っていれば、空白も列名の一部になります。

見た目では区別しにくい違いもあります。全角の空白「 」、全角のかっこ「()」、前後の空白は、Excelの画面ではほとんど同じに見えますが、Pythonでは別の文字です。そのため、列名を「氏名」と書いても、表の列名が「氏名 」なら見つからず、KeyErrorで止まります。

列名の空白と全角・半角をまとめてそろえる

表の列名(df.columns)には、文字の列と同じように.strの操作が使えます。pandasのユーザーガイドでは、この操作は表の列名を整えたり変えたりするのにとくに役立つとして、前後の空白を消す・小文字にする・空白を下線に置き換える、をつなげて列名を整える例を挙げています。

全角と半角をそろえるには、str.normalizeを使います。資料によると、文字をUnicodeの正規形にそろえる働きで、形の指定はNFC・NFKC・NFD・NFKDの4つです。この記事ではNFKCを使い、全角のかっこ「()」を半角の「()」に変えています。

対応表で列名を変える(rename)

renameは、列名や行の名前を変える働きをします。columnsに「前の名前: 新しい名前」の辞書(対応表)を渡すと、その列だけ名前が変わります。資料によると、対応表に無い列はそのまま残り、対応表に書いた名前が表に無くても、エラーにはなりません。

errors="raise"を付けると、対応表の中に表に無い名前があったとき、KeyErrorで止まります。対応表の書きまちがいや、見出しの変更に気づけるので、この記事のコードでは付けています。

renameは、列名を変えた新しい表を返します。資料では、表をその場で書き換えるinplaceの指定は、3.1.0で非推奨になったとしています。結果は、df = df.rename(...)のように受け取り直します。

手順: 売上の表の列名をそろえて別のファイルに保存する

次のコードは、架空の売上の表 sales.xlsx(社員番号・氏名・部署名・売上の4列。見出しには、前後の空白と全角のかっこが混ざっています)を読み込み、列名をそろえてから、対応表で「部署名」を「部署」、「売上(円)」を「売上」に変えます。そろえた表はsales_renamed.xlsxという別のファイルに書き出し、元のsales.xlsxには手を加えません。手元の表に使うときは、対応表とファイル名を書き換えます。元のファイルは、念のため作業の前に別の場所へ写しておきます。

import pandas as pd

# 元の表を読み込む(このファイルは書き換えない)
src_file = "sales.xlsx"
df = pd.read_excel(src_file)
print(list(df.columns))

# 列名の前後の空白を消し、全角の英数字・記号を半角にそろえる
df.columns = df.columns.str.strip().str.normalize("NFKC")

# 対応表に沿って列名を変える(表に無い名前があれば止める)
new_names = {"部署名": "部署", "売上(円)": "売上"}
df = df.rename(columns=new_names, errors="raise")

# 同じ名前の列ができていたら、保存の前に止める
if df.columns.duplicated().any():
    raise ValueError("同じ名前の列があります")
print(list(df.columns))

# 列名をそろえた表を、新しいファイルに書き出す
df.to_excel("sales_renamed.xlsx", index=False)

コードを動かすには、pandasのほかに、新しい形式のExcelのファイル(xlsx)を扱うopenpyxlが要ります。対応表の左側には、空白と全角をそろえた後の名前を書きます。そろえる前の「売上(円)」のままだと、表の列名と一致しません。

実行した結果

架空の売上の表(3人分の3行。見出しは「 社員番号」「氏名 」「部署名」「売上(円)」)で試したところ、次のようになりました。

  • 読み込んだ直後の列名は、先頭の半角の空白、末尾の全角の空白、全角のかっこが、見出しのまま入っていました
  • 空白を消して半角にそろえた後、対応表で変えた列名は「社員番号」「氏名」「部署」「売上」の4つになりました
  • 保存したsales_renamed.xlsxを開くと、そろえた4つの見出しの下に3行が並び、値は元の表と同じでした
  • 元のsales.xlsxは、コードを動かした後も中身が変わっていませんでした

試した環境は、Mac の作業PCに入れた Python 3.12.15 と pandas 3.0.6、openpyxl 3.1.5 です。

自分で直すか、相談するかの判断

判断の目安は、「列の中身が同じだと言い切れるか」です。「売上」と「売上(円)」のように、名前が違うだけで中身が同じだと確かめられる列は、対応表に足して自分でそろえられます。

「売上」と「売上(税込)」のように、名前が似ていても中身が違うかもしれない列は、同じ名前にしてはいけません。どちらの数字を使うかは、表を作った人や、集計を頼んだ人に確かめてから決めます。

つまずきやすいところ

  • errorsを付けずに書きまちがえる: 初期の設定では、対応表に無い名前は黙って無視されます。架空の表で、対応表に「売上(円)」と全角のまま書くと、エラーにならず、列名は「売上(円)」のまま残りました。errors="raise"を付けると、KeyErrorで止まりました
  • 空白を消さずに列を取り出す: 見出しが「氏名 」のままでは、df["氏名"]はKeyErrorで止まりました
  • 同じ名前の列ができる: 「売上」と「売上(円)」の両方がある表で「売上(円)」を「売上」に変えると、「売上」が2列になり、df["売上"]は2列の表になりました。記事のコードは、この場合にValueErrorで止まります
  • renameの結果を受け取らない: df.rename(...)だけを書くと、dfの列名は変わりませんでした。df = df.rename(...)と書きます
  • 値の空白や全角が残っている: 列名をそろえても、セルの値はそのままです。値のそろえ方は、PythonでExcelの表の文字の前後の空白と全角・半角をそろえる手順で紹介しています
  • そろえた列名でほかの表とつなげるとき: 2つの表の列名を同じにしておくと、共通の列で結合しやすくなります。結合の手順は、PythonでExcelの2つの表を共通の列で結合する手順にあります。複数のファイルを1つにまとめる方法の選び方は、Excelの複数ファイルを1つにまとめる方法が参考になります

まとめ

  • 列名は、columns.str.stripで前後の空白を消し、str.normalizeで全角と半角をそろえてから扱います
  • 名前を変えるときは、対応表をrenameに渡し、errors="raise"で書きまちがいに気づけるようにします
  • renameの結果はdf = df.rename(...)で受け取り直し、同じ名前の列ができていないかを保存の前に確かめます
  • 結果は新しいファイルとして保存し、元の表は残します