PythonでExcelを読み込む入門 — pandas.read_excel
はじめてでも迷わないように、基本の使い方から「つまずきポイント」まで、やさしく丁寧に整理します。実行できるコード例、よくあるシート構成のテンプレート、練習問題も用意しました。
事前準備と基本の流れ
必要なライブラリのインストール
- pandas: データ分析の定番ライブラリ
pip install pandas - Excelエンジン: .xlsx は openpyxl、.xls は xlrd が必要
pip install openpyxl pip install xlrd
最小コード(まずは1枚のシートを読む)
import pandas as pd
# 同じフォルダにある "sample.xlsx" の先頭シートを読み込む
df = pd.read_excel("sample.xlsx")
# 中身を確認
print(df.head()) # 先頭5行
print(df.info()) # 列名・型・欠損の有無
Python- ポイント: まずは
head()とinfo()を見て「列名」「データ型」「欠損(NaN)」を把握します。
よく使う引数と実例テンプレート
シートを指定する(sheet_name)
# シート名で指定
df = pd.read_excel("sales.xlsx", sheet_name="2024_Q4")
# 複数シートを一度に読み込み(辞書で返る)
dfs = pd.read_excel("sales.xlsx", sheet_name=["2024_Q3", "2024_Q4"])
print(dfs["2024_Q4"].head())
Python- ポイント: 複数読み込み時は「シート名→DataFrame」の辞書になります。
列や範囲を絞る(usecols)
# 列名で列を選択
df = pd.read_excel("sales.xlsx", usecols=["Date", "Product", "Revenue"])
# Excelの列記法で指定(A〜D列)
df = pd.read_excel("sales.xlsx", usecols="A:D")
Python- ポイント: 読み込み段階で不要列を避けると速く、メモリも節約できます。
ヘッダー行の指定(header)
# 2行目が列名の場合(0始まりなので1)
df = pd.read_excel("report.xlsx", header=1)
Python- ポイント: タイトル行や説明行が先頭にある帳票でよく使います。
先頭の余分な行を飛ばす(skiprows)
# 先頭3行をスキップ(0,1,2行目を飛ばす)
df = pd.read_excel("report.xlsx", skiprows=3)
Python- ポイント: 会社ロゴや注記を含む帳票で「本データ開始行」まで飛ばすのが定石。
行番号・列名の扱い(index_col、names)
# 1列目を行番号として使う
df = pd.read_excel("table.xlsx", index_col=0)
# ヘッダーがない(列名を自分で付ける)
df = pd.read_excel("no_header.xlsx", header=None, names=["Date", "Item", "Qty", "Price"])
Python- ポイント: 入力データが「見出しなし」のときは
header=Noneとnamesをセットで。
型の指定(dtype)と特殊変換(converters)
# 誤って数値扱いされた商品コードを文字列に固定
df = pd.read_excel("items.xlsx", dtype={"ItemCode": "string"})
# 文字列をクリーニングして数値化する例
def clean_int(s):
if pd.isna(s):
return None
return int(str(s).replace(",", "").strip())
df = pd.read_excel("items.xlsx", converters={"Qty": clean_int})
Python- ポイント: 「郵便番号」「先頭ゼロつきコード」は文字列型に固定が安全。
日付の扱い(parse_dates、dayfirst)
# 日付列を自動で日付型へ
df = pd.read_excel("log.xlsx", parse_dates=["Date"])
# 日付が DD/MM/YYYY 形式なら
df = pd.read_excel("log.xlsx", parse_dates=["Date"], dayfirst=True)
Python- ポイント: 日付は文字列のままだと計算・比較が面倒。読み込みで型変換を済ませると楽です。
欠損値の指定(na_values、keep_default_na)
# 特定の文字を欠損扱いにする
df = pd.read_excel("survey.xlsx", na_values=["N/A", "-", "不明"])
# 既定の欠損(空白や 'NA' など)を無効にしたい場合
df = pd.read_excel("survey.xlsx", keep_default_na=False)
Python- ポイント: 帳票独特の「不明」「—」などをNaNに揃えると解析がしやすくなります。
実践シナリオ別テンプレート
帳票の先頭にタイトルや注記がある
import pandas as pd
df = pd.read_excel(
"monthly_report.xlsx",
skiprows=5, # 6行目からが表
header=0, # その行が列名
usecols="A:F" # 欲しい列だけ
)
print(df.head())
Python- 狙い: 読み込み段階で「余分」を削り、列名も整える。
複数シートを縦に結合して1つの表へ
import pandas as pd
sheets = ["2024_Q1", "2024_Q2", "2024_Q3", "2024_Q4"]
dfs = [pd.read_excel("sales.xlsx", sheet_name=s, usecols=["Date", "Product", "Revenue"]) for s in sheets]
all_sales = pd.concat(dfs, ignore_index=True)
print(all_sales.shape)
Python- 狙い: 四半期別シートを「縦方向に」連結して通期データ1本に。
列型を強制して分析前に整える
import pandas as pd
df = pd.read_excel(
"orders.xlsx",
dtype={"OrderID": "string", "CustomerID": "string"},
parse_dates=["OrderDate"],
na_values=["-", "N/A"]
)
# 洗浄の一例
df["Qty"] = df["Qty"].astype("Int64") # 欠損に対応する整数型
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
Python- 狙い: 文字列・整数・日付を先に固めると、この後の集計が安定します。
Excelの列記法で範囲を読む(表が途中から始まる)
import pandas as pd
# 例: 実データは B4 から G100 まで(列はB〜G、行は3行スキップ)
df = pd.read_excel("layout.xlsx", usecols="B:G", skiprows=3, nrows=97)
print(df.head())
Python- 狙い: レイアウトの都合で表が途中から始まる帳票に対応。
読み込み後のよくある整形ワザ
- 空白の除去:
df = df.rename(columns=lambda c: c.strip())
for col in df.select_dtypes(include="object"):
df[col] = df[col].str.strip()
Python- 重複行の除去:
df = df.drop_duplicates()
Python- 列名の一括リネーム(日本語→英語やスネークケース):
df = df.rename(columns={
"日付": "date",
"商品名": "product",
"金額(円)": "amount_jpy"
})
Python- 欠損の補完:
df["amount_jpy"] = df["amount_jpy"].fillna(0)
Pythonつまずきやすいポイントと回避策
- .xlsx が読めない:
原因: openpyxl が未インストール。
対策:pip install openpyxl - .xls が読めない:
原因: xlrd のサポート。
対策:pip install xlrd - 先頭ゼロが消える(郵便番号・商品コード):
原因: 数値として解釈。
対策:dtype={"PostalCode": "string"}で文字列固定。 - 日付が文字列のまま:
原因: フォーマット混在。
対策:parse_dates=["Date"]、または後処理でpd.to_datetime(df["Date"], errors="coerce") - 変な記号や「—」が混じる:
対策:na_values=["—", "-"]で欠損化、またはstr.replaceでクリーニング。
ミニ例題(手を動かして慣れる)
例題1:売上シートの基本読み込み
- 課題:
sales.xlsxの「2025_Q3」シートから「Date, Product, Revenue」だけ読み込み、先頭10行を表示。 - ヒント:
sheet_nameとusecolsを使う。
import pandas as pd
df = pd.read_excel("sales.xlsx", sheet_name="2025_Q3", usecols=["Date", "Product", "Revenue"])
print(df.head(10))
Python例題2:タイトル行スキップ+列名付け
- 課題: 先頭5行が説明の
report.xlsxを6行目から読んで、列名を["date","item","qty","price"]にする。 - ヒント:
skiprowsとheader=None、names。
import pandas as pd
df = pd.read_excel("report.xlsx", skiprows=5, header=None, names=["date","item","qty","price"])
print(df.info())
Python例題3:型の固定と集計
- 課題:
orders.xlsxのOrderIDを文字列、OrderDateを日付、Amountを数値にして、月別合計金額を出す。
import pandas as pd
df = pd.read_excel(
"orders.xlsx",
dtype={"OrderID": "string"},
parse_dates=["OrderDate"]
)
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
monthly = (
df.assign(month=df["OrderDate"].dt.to_period("M"))
.groupby("month", as_index=False)["Amount"].sum()
)
print(monthly)
Python逆引き早見リスト(覚えておくと便利)
- シート指定:
sheet_name="Sheet1"または["S1","S2"] - 列選択:
usecols=["A","B"]やusecols="A:D" - ヘッダー行:
header=0(既定)/header=None(列名なし) - 先頭行スキップ:
skiprows=3 - 行数制限:
nrows=100 - 行番号列:
index_col=0 - 型指定:
dtype={"Code":"string"} - 日付変換:
parse_dates=["Date"] - 欠損指定:
na_values=["-", "N/A"] - カスタム変換:
converters={"Qty": func}
