「読み込んだあとに 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"]
)
Python1行目はスキップされずに「データの開始位置」として使われますが、
列名は完全に 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)
Pythonheader=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"
})
Pythonnames を使うか、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は、何行目からがデータか?」を一度目で確認してから、header と names を決める癖をつけると安全です。
小さな練習問題
練習1:日本語ヘッダーの sales.xlsx を、英語列名で読み込む
条件は次の通りです。
- Excelのヘッダーが「売上日」「商品名」「販売数量」「売上金額(税込)」
names=["date", "product", "qty", "amount"]で読み込むdf.columnsを表示して確認する
練習2:ヘッダーなしの sales_no_header.xlsx を、date, product, qty, amount で読み込む
条件は次の通りです。
header=Noneを指定するnamesで4つの列名を与える- 先頭5行を表示して、列名とデータの対応を確認する
最後に
names=[...] は、
「Excelの列名に振り回されず、最初から自分のルールで列名を決める」ためのスイッチです。
これをうまく使うと、
コードが短く読みやすくなる
日本語・長い列名・微妙な名前から解放される
後続の処理(集計・結合・可視化)が書きやすくなる
という、地味だけど効き目の大きいメリットが手に入ります。
あなたが「この列名、毎回書くのしんどいな」と感じているExcelがあれば、
一度 names で「理想の列名」を決めてから読み込んでみてください。
そこから、Python側の世界が一気に整い始めます。
