Python Excel操作 逆引き集 | 読み込み時に列名をリネームして取り込む

Python Python
スポンサーリンク

「読み込んだあとに rename」ではなく「最初からいい名前で読む」

Excelの列名って、だいたいこうですよね。

「日付(売上)」
「売上金額(税込)」
「Unnamed: 3」
「No.」

人間には意味がわかるけど、コードに書くには長い・日本語混じり・記号だらけ。
そこでよくやるのが、読み込んだあとに df.rename(columns={...}) で直す方法です。

でも、names=[...] を使うと、
「読み込み時点で、こちらが決めた“きれいな列名”を付けてしまう」ことができます。
つまり、「Excelの列名は参考程度にして、Python側の都合のいい名前で受け取る」スタイルです。


基本形:names=[…] で列名を上書きして読む

一番シンプルな使い方

import pandas as pd

df = pd.read_excel(
    "sales.xlsx",
    header=0,
    names=["date", "product", "qty", "amount"]
)

print(df.head())
print(df.columns)
Python

ここでのポイントは、

Excel側の1行目は「ヘッダーとして読むけれど、名前は自分で指定したものにする」
という挙動になることです。

header=0 は「1行目をヘッダーとして扱う」
names=[...] は「でも列名はこれに上書きする」

この2つがセットで効いています。

Excelの1行目は「データの開始位置を決めるため」に使い、
実際の列名は names で決める、というイメージです。


header と names の関係をしっかり理解する

よく使うパターン1:header=0 と names を一緒に使う

Excelの1行目に「それっぽい列名」はあるけれど、
Pythonで扱うには長い・微妙・日本語混じり、というケース。

例えば、Excelのヘッダーがこうだとします。

「売上日」「商品名」「販売数量」「売上金額(税込)」

これを、Python側ではこうしたい:

date, product, qty, amount

その場合のコードはこうです。

df = pd.read_excel(
    "sales.xlsx",
    header=0,
    names=["date", "product", "qty", "amount"]
)
Python

1行目はスキップされずに「データの開始位置」として使われますが、
列名は完全に names で上書きされます。

よく使うパターン2:header=None と names を使う(ヘッダー行がない場合)

Excelにヘッダー行がなく、いきなりデータが始まるパターンもあります。

A列B列C列
2025/01/01りんご10
2025/01/02みかん5

この場合は、こう書きます。

df = pd.read_excel(
    "sales_no_header.xlsx",
    header=None,
    names=["date", "product", "qty"]
)

print(df.head())
print(df.columns)
Python

header=None で「ヘッダー行はない」と宣言し、
names で「じゃあこの名前を列名として使ってね」と教える形です。

ここがとても重要で、
「ヘッダーがあるのか」「ないのか」で header の指定が変わり、
それに合わせて names の意味も変わります。


実務での使いどころ

日本語・長い列名を、最初からシンプルな英語にしておく

例えば、こんなヘッダーのExcelを想像してください。

「売上日」「商品名」「販売数量」「売上金額(税込)」

これをそのまま使うと、コードがこうなります。

df["売上金額(税込)"].sum()
Python

毎回これを書くのはつらいので、読み込み時にこうしてしまいます。

df = pd.read_excel(
    "sales.xlsx",
    header=0,
    names=["date", "product", "qty", "amount"]
)

total = df["amount"].sum()
Python

以降のコードが一気に読みやすくなります。
「Excelの列名は人間向け、Pythonの列名はコード向け」と割り切る感じです。

「No.」「Unnamed: 0」などの微妙な列名を、意味のある名前に変える

例えば、こんなヘッダー:

「No.」「顧客名」「住所」「電話番号」

これを、

id, name, address, tel

にしたい場合。

df = pd.read_excel(
    "customers.xlsx",
    header=0,
    names=["id", "name", "address", "tel"]
)
Python

これで、df["id"]df["name"] のように、直感的な名前で扱えます。


names と usecols を組み合わせる

列を絞りつつ、名前も付け直す

「Excelには列がたくさんあるけど、使うのは一部だけ。しかも名前も変えたい」
というのはよくあるパターンです。

例えば、Excelのヘッダーがこうだとします。

「売上日」「商品名」「販売数量」「売上金額(税込)」「担当者」「メモ」

使いたいのは「売上日」「商品名」「売上金額(税込)」だけで、
名前は date, product, amount にしたい。

import pandas as pd

df = pd.read_excel(
    "sales.xlsx",
    header=0,
    usecols=["売上日", "商品名", "売上金額(税込)"],
    names=["date", "product", "amount"]
)

print(df.head())
print(df.columns)
Python

ここでのポイントは、

usecols で「どの列を残すか」を決める
names で「残した列にどんな名前を付けるか」を決める

という役割分担です。


読み込み後に rename する場合との違い

読み込み後 rename の書き方

もちろん、こう書いても同じことはできます。

df = pd.read_excel("sales.xlsx", header=0)

df = df.rename(columns={
    "売上日": "date",
    "商品名": "product",
    "販売数量": "qty",
    "売上金額(税込)": "amount"
})
Python

names を使うか、rename を使うかは好みですが、
「最初から列名を決め打ちしたい」「ヘッダー行の中身はあまり信用していない」
というときは names の方がスッキリします。

逆に、「元の列名も一応残しておきたい」「一部だけ変えたい」なら、
読み込み後に rename の方が柔軟です。


実践テンプレート

テンプレ1:ヘッダー付きExcelを、英語列名で読み込んで集計

import pandas as pd

df = pd.read_excel(
    "sales.xlsx",
    header=0,
    names=["date", "product", "qty", "amount"]
)

df["date"] = pd.to_datetime(df["date"], errors="coerce")
df["qty"] = pd.to_numeric(df["qty"], errors="coerce")
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")

monthly = (
    df.assign(month=df["date"].dt.to_period("M"))
      .groupby("month", as_index=False)["amount"].sum()
)

print(df.columns)
print(monthly)
Python

テンプレ2:ヘッダーなしExcelを、きれいな列名で読み込む

import pandas as pd

df = pd.read_excel(
    "sales_no_header.xlsx",
    header=None,
    names=["date", "product", "qty", "amount"]
)

print(df.head())
print(df.columns)
Python

つまずきやすいポイントと注意点

names の数は「読み込む列の数」と一致させる

names に渡すリストの長さは、「最終的に読み込まれる列数」と一致している必要があります。

例えば、usecols で3列だけに絞っているのに、names を4つ書くとエラーになります。

# これはダメ(usecols は3列、names は4つ)
df = pd.read_excel(
    "sales.xlsx",
    header=0,
    usecols=["売上日", "商品名", "売上金額(税込)"],
    names=["date", "product", "amount", "extra"]
)
Python

まずは usecols でどの列を読むか決めてから、
その数に合わせて names を書く、という順番を意識してください。

header の指定を間違えると、1行目がデータとして入ってしまう

本当は1行目がヘッダーなのに header=None にしてしまうと、
1行目が「データの1行目」として扱われてしまいます。

逆に、ヘッダーがないのに header=0 にすると、
1行目のデータが列名として食われてしまいます。

「このExcelは、何行目からがデータか?」を一度目で確認してから、
headernames を決める癖をつけると安全です。


小さな練習問題

練習1:日本語ヘッダーの sales.xlsx を、英語列名で読み込む

条件は次の通りです。

  1. Excelのヘッダーが「売上日」「商品名」「販売数量」「売上金額(税込)」
  2. names=["date", "product", "qty", "amount"] で読み込む
  3. df.columns を表示して確認する

練習2:ヘッダーなしの sales_no_header.xlsx を、date, product, qty, amount で読み込む

条件は次の通りです。

  1. header=None を指定する
  2. names で4つの列名を与える
  3. 先頭5行を表示して、列名とデータの対応を確認する

最後に

names=[...] は、
「Excelの列名に振り回されず、最初から自分のルールで列名を決める」ためのスイッチです。

これをうまく使うと、

コードが短く読みやすくなる
日本語・長い列名・微妙な名前から解放される
後続の処理(集計・結合・可視化)が書きやすくなる

という、地味だけど効き目の大きいメリットが手に入ります。

あなたが「この列名、毎回書くのしんどいな」と感じているExcelがあれば、
一度 names で「理想の列名」を決めてから読み込んでみてください。
そこから、Python側の世界が一気に整い始めます。

タイトルとURLをコピーしました