Pythonで「列名がないExcel」を読み込む入門 — header=None
Excelファイルによっては「列名(ヘッダー行)」がなく、いきなりデータが始まることがあります。その場合に便利なのが header=None。初心者向けに、コード例とテンプレートを交えて解説します。
基本の使い方
import pandas as pd
# 列名がないExcelを読み込む
df = pd.read_excel("no_header.xlsx", header=None)
print(df.head())
Python- ポイント:
header=Noneを指定すると、pandas は「列名がない」と判断し、0,1,2,… の番号を自動で列名にします。- そのままでは扱いにくいので、後で自分で列名を付けるのが一般的です。
列名を自分で付ける — names 引数
import pandas as pd
df = pd.read_excel(
"no_header.xlsx",
header=None,
names=["Date", "Item", "Qty", "Price"]
)
print(df.head())
Python- ポイント:
namesにリストを渡すと、そのまま列名になります。- 列数と同じ数の名前を用意する必要があります。
よくあるパターン別テンプレート
1. 列名なし → 自分で付ける
df = pd.read_excel("data.xlsx", header=None, names=["日付", "商品", "数量", "金額"])
Python2. 先頭に説明行がある → スキップして列名を付ける
df = pd.read_excel(
"report.xlsx",
header=None,
skiprows=5, # 6行目からデータ
names=["date", "item", "qty", "price"]
)
Python3. 列数が多い → 自動で「col1, col2, …」と付ける
df = pd.read_excel("bigdata.xlsx", header=None)
df.columns = [f"col{i+1}" for i in range(df.shape[1])]
Python読み込み後の整形ワザ
- 空白除去:
df = df.applymap(lambda x: str(x).strip() if isinstance(x, str) else x)
Python- 型変換:
df["数量"] = pd.to_numeric(df["数量"], errors="coerce")
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
Python- 日付変換:
df["日付"] = pd.to_datetime(df["日付"], errors="coerce")
Pythonつまずきやすいポイント
- 列数と
namesの数が合わない → エラー
→ 列数を確認してから名前を付ける。 - 先頭ゼロが消える(郵便番号やコード)
→dtype={"郵便番号": "string"}を指定。 - 日付が文字列のまま
→parse_datesはheader=Noneでは効かないことがあるので、後処理でpd.to_datetimeを使う。
ミニ例題(練習用)
例題1:列名なしの売上データを読み込んで列名を付ける
- 課題:
sales.xlsxのシートには列名がなく、列は「日付, 商品, 数量, 金額」。列名を付けて先頭10行を表示。
import pandas as pd
df = pd.read_excel("sales.xlsx", header=None, names=["日付", "商品", "数量", "金額"])
print(df.head(10))
Python例題2:説明行を飛ばして列名を付ける
- 課題:
report.xlsxの先頭3行は説明。4行目からデータ。列は「date, item, qty, price」。
import pandas as pd
df = pd.read_excel("report.xlsx", header=None, skiprows=3, names=["date", "item", "qty", "price"])
print(df.info())
Python例題3:列名を自動生成して集計
- 課題:
orders.xlsxの列名なしデータを読み込み、列名を「col1, col2, …」にして、3列目の合計を出す。
import pandas as pd
df = pd.read_excel("orders.xlsx", header=None)
df.columns = [f"col{i+1}" for i in range(df.shape[1])]
print("3列目の合計:", df["col3"].sum())
Pythonまとめ
- 列名がない →
header=None - 自分で列名を付けたい →
names=[...] - 説明行を飛ばす →
skiprowsと組み合わせる - 列数が多い → 自動生成で
col1, col2, …
