pandas.read_excel とは何か
pandas.read_excel は、「Excelファイル → DataFrame」に変換するための入り口です。
一度 DataFrame にしてしまえば、集計・グラフ・機械学習まで全部ここから進められます。
だからこそ「最初の読み込み」を丁寧に設計しておくと、その後のコードが一気にシンプルになります。
import pandas as pd
df = pd.read_excel("sales.xlsx")
print(df.head())
print(df.info())
Pythonまずはこれが最小形です。head() で中身をざっと眺めて、info() で列名・型・欠損の雰囲気を掴むのが最初の一歩です。
一番よく使う引数たちを押さえる
シートを選ぶ sheet_name
Excelはシートを複数持てるので、「どのシートを読むか」を決めます。
df = pd.read_excel("sales.xlsx", sheet_name="2025_Q1")
# 先頭シートなら sheet_name=0 でもOK
df0 = pd.read_excel("sales.xlsx", sheet_name=0)
Pythonここを曖昧にすると「違うシートを読んでいた」みたいな事故が起きがちです。
実務では、シート名を文字列で明示するクセをつけると安全です。
読みたい列だけに絞る usecols
全部の列を読む必要はほとんどありません。
「必要な列だけ読む」だけで、処理速度もメモリもかなり変わります。
# 列名で指定
df = pd.read_excel("sales.xlsx", usecols=["Date", "Product", "Revenue"])
# 列記号で範囲指定
df = pd.read_excel("sales.xlsx", usecols="A:D")
Python最初から「この分析に本当に必要な列はどれか?」を意識しておくと、DataFrameがスリムになって扱いやすくなります。
ヘッダー行を決める header と skiprows
現場のExcelは、だいたい先頭にタイトルや注記が入っています。
「どこからが表なのか」を skiprows と header で合わせます。
df = pd.read_excel(
"report.xlsx",
skiprows=5, # 6行目からが表
header=0 # その行を列名として使う
)
Pythonここがズレると、列名がデータになったり、データが欠けたりして地獄になります。
最初は小さく読み込んで print(df.head()) で「列名と1行目」が想定通りか必ず確認しましょう。
インデックス列を決める index_col
顧客IDや日付など、「行を一意に識別するキー」があるなら、インデックスにしておくと後が楽です。
df = pd.read_excel(
"sales.xlsx",
usecols=["Date", "Product", "Revenue"],
parse_dates=["Date"],
index_col="Date"
)
print(df.loc["2025-01-01":"2025-01-31"])
Pythonインデックスにしておくと、loc での抽出や結合が直感的になります。
ただし、欠損や重複が多い列をインデックスにするのは避けた方がいいです。
型を整えるのが「読み込みのキモ」
dtype で「文字列か数値か」をはっきりさせる
Excelは何でもかんでも受け入れてくれるので、同じ列に数字と文字が混ざっていることがよくあります。dtype で「この列はこう扱う」と最初に決めておくと、後の変換が安定します。
df = pd.read_excel(
"orders.xlsx",
dtype={
"OrderID": "string", # 先頭ゼロを守りたいコード類
"Qty": "Int64" # 欠損を許容する整数型
}
)
Pythonコードや郵便番号などは "string" にしておくと、先頭ゼロが消えません。
整数列は、欠損があり得るなら Int64(nullable整数)を使うのがポイントです。
parse_dates で日付を datetime にしておく
日付を文字列のままにしておくと、あとで毎回 to_datetime する羽目になります。
読み込み時に parse_dates を指定しておくと、すぐに .dt アクセサで扱えるようになります。
df = pd.read_excel(
"sales.xlsx",
usecols=["Date", "Revenue"],
parse_dates=["Date"]
)
monthly = (
df.assign(month=df["Date"].dt.to_period("M"))
.groupby("month", as_index=False)["Revenue"].sum()
)
print(monthly)
Pythonここをサボると、「日付の集計だけやたらコードが長い」状態になります。
日付列があるなら、基本的に parse_dates を付ける、くらいの感覚でOKです。
na_values で「実質欠損」をちゃんと欠損にする
「-」「NA」「不明」みたいな値は、実質的には欠損です。
これを数値や文字列として残してしまうと、集計時に邪魔になります。
df = pd.read_excel(
"report.xlsx",
usecols=["Date", "Revenue"],
parse_dates=["Date"],
na_values=["-", "NA", "不明"]
)
print(df.isna().sum())
Python「この記号や文字は欠損扱いしたい」というルールを、読み込み時に na_values で宣言しておくと、後処理がかなり楽になります。
読み込み時に「きれいな形」に寄せるテクニック
converters で列ごとに変換関数をかける
「カンマ付き金額」「単位付き数値」「余計な空白」などは、converters で読み込み時に掃除してしまうのが一番スマートです。
import pandas as pd
def clean_amount(x):
if pd.isna(x):
return None
s = str(x).replace(",", "").replace("円", "").strip()
return float(s) if s else None
df = pd.read_excel(
"sales.xlsx",
parse_dates=["日付"],
converters={
"金額": clean_amount,
"商品名": lambda x: str(x).strip()
}
)
Python「読み込んでから毎回同じ前処理をする」より、「読み込み時に一度だけきれいにする」方が、コードもバグも減ります。
names と header で列名を最初から整える
現場のExcelの列名は、分析向きではないことが多いです。names で「最終的に使いたい列名」を最初から付けてしまうと、その後のコードが読みやすくなります。
df = pd.read_excel(
"report.xlsx",
skiprows=4,
header=None,
names=["date", "product", "qty", "amount"],
parse_dates=["date"]
)
Python「日本語の列名を毎回英語に rename する」より、「読み込み時に英語名で受け取る」方がスッキリします。
典型パターンをまとめたテンプレート
例1:よくある「売上明細」帳票を読むフルセット
import pandas as pd
df = pd.read_excel(
"sales.xlsx",
sheet_name="2025",
skiprows=4, # タイトル・注記を飛ばす
header=0,
usecols=["日付", "商品コード", "商品名", "数量", "金額"],
names=["date", "code", "name", "qty", "amount"], # 列名を統一
parse_dates=["date"],
dtype={"code": "string"}, # コードは文字列
na_values=["-", "NA", "不明"],
converters={
"amount": lambda x: float(str(x).replace(",", "")) if pd.notna(x) else None
}
)
monthly = (
df.assign(month=df["date"].dt.to_period("M"))
.groupby("month", as_index=False)["amount"].sum()
)
print(monthly)
Pythonこのテンプレートのポイントは、「読み込みが終わった瞬間に、もう分析に使える形になっている」ことです。
ここまで整えておくと、後は可視化や機械学習にそのまま渡せます。
例2:必要列だけ読み込んで、顧客別の合計を出す
import pandas as pd
df = pd.read_excel(
"customers.xlsx",
sheet_name="Detail",
usecols=["顧客ID", "顧客名", "金額"],
names=["customer_id", "customer_name", "amount"],
header=0,
converters={"amount": lambda x: float(str(x).replace(",", "")) if pd.notna(x) else None},
dtype={"customer_id": "string"}
)
summary = df.groupby(["customer_id", "customer_name"], as_index=False)["amount"].sum()
print(summary.head())
Python「usecols で絞る」「names で列名を整える」「converters で数値化する」—この3点セットはかなり汎用的に使えます。
小さな練習問題
練習1:日付と金額だけを読み、月次合計を出す
手元の sales.xlsx に「日付」「金額」があるとします。
次の条件でコードを書いてみてください。
- 「日付」「金額」列だけを読み込む
- 日付は datetime 型にする
- 金額はカンマ付きでも正しく数値化する
- 月ごとの合計金額を表示する
ヒントはここまでに全部出ています。自分で書いてみて、うまくいかなかったらどこで詰まったか教えてください。
練習2:先頭に説明行がある帳票を正しく読む
先頭3行が説明文、4行目が列名、5行目以降がデータ、という Excel を想像してください。
次の条件で読み込んでみてください。
- 説明行は無視する
- 列名は自分で
["date", "item", "qty", "amount"]にする qtyとamountを数値化して、合計を出す
ここまでできるようになると、現場のほとんどの Excel は怖くなくなります。
最後に
read_excel は「ただファイルを読む関数」ではなく、「データをきれいな形にして受け取るための入り口」です。
シート名、列の選択、ヘッダー位置、型、欠損、変換関数——ここを丁寧に設計するほど、その後のコードは短く、読みやすく、バグが少なくなります。
