Pythonで既存のExcelを「シートごとにDataFrameの辞書」で読み込む — pandas.read_excel(sheet_name=None)
Excelファイルには複数のシートが入っていることが多いですよね。pandas.read_excel に sheet_name=None を指定すると、すべてのシートをまとめて読み込み、シート名をキー、DataFrameを値とする辞書(dict) が返ってきます。これを使うと「シートごとに処理」「全シートを結合」などが簡単になります。
基本の使い方
import pandas as pd
# Excelファイルの全シートを辞書として読み込む
dfs = pd.read_excel("book.xlsx", sheet_name=None)
print(type(dfs)) # <class 'dict'>
print(dfs.keys()) # シート名の一覧
print(dfs["Sheet1"].head()) # 特定シートの先頭5行
Python- 返り値:
dict型- キー → シート名(文字列)
- 値 → DataFrame
よくあるパターン別テンプレート
1. 全シートを読み込んで一覧表示
dfs = pd.read_excel("sales.xlsx", sheet_name=None)
for name, df in dfs.items():
print(f"--- {name} ---")
print(df.head())
Python2. 特定の複数シートだけ読み込む
dfs = pd.read_excel("sales.xlsx", sheet_name=["2025_Q1", "2025_Q2"])
print(dfs["2025_Q1"].head())
Python3. 全シートを縦に結合して1つの表に
dfs = pd.read_excel("sales.xlsx", sheet_name=None, usecols=["Date", "Product", "Revenue"], parse_dates=["Date"])
all_sales = pd.concat(dfs.values(), ignore_index=True)
print(all_sales.shape)
Python4. シート名を列に追加して結合
dfs = pd.read_excel("sales.xlsx", sheet_name=None, usecols=["Date", "Revenue"], parse_dates=["Date"])
frames = []
for name, df in dfs.items():
df = df.copy()
df["sheet"] = name
frames.append(df)
final = pd.concat(frames, ignore_index=True)
print(final.head())
Python読み込み後の整形ワザ
- 列名を統一する:
for name, df in dfs.items():
dfs[name] = df.rename(columns=lambda c: str(c).strip())
Python- 数値列を一括変換:
for name, df in dfs.items():
if "Revenue" in df.columns:
df["Revenue"] = pd.to_numeric(df["Revenue"], errors="coerce")
Python- 共通列だけ抽出して結合:
common_cols = {"Date", "Product", "Revenue"}
merged = pd.concat([d[list(common_cols)] for d in dfs.values() if common_cols.issubset(d.columns)], ignore_index=True)
Pythonつまずきやすいポイントと回避策
- シートごとに列構成が違う:
→ 読み込み後に列名を正規化してから結合する。 - 先頭ゼロが消える(コード列):
→dtype={"Code": "string"}を指定して文字列固定。 - 日付が文字列のまま:
→parse_dates=["Date"]を指定。混在時は後処理でpd.to_datetime(..., errors="coerce")。 - 巨大ファイルでメモリ不足:
→ 必要なシート名だけ指定して読む。不要ならusecolsで列を絞る。
ミニ例題(練習用)
例題1:全シートを読み込んで縦結合
import pandas as pd
dfs = pd.read_excel("sales.xlsx", sheet_name=None, usecols=["Product", "Revenue"])
all_sales = pd.concat(dfs.values(), ignore_index=True)
print(all_sales.groupby("Product")["Revenue"].sum())
Python例題2:シート名をラベルとして保持
import pandas as pd
dfs = pd.read_excel("sales.xlsx", sheet_name=None, usecols=["Date", "Revenue"], parse_dates=["Date"])
frames = []
for name, df in dfs.items():
df["quarter"] = name
frames.append(df)
final = pd.concat(frames, ignore_index=True)
print(final.groupby("quarter")["Revenue"].sum())
Python例題3:列構成が違うシートを正規化して結合
import pandas as pd
raw = pd.read_excel("report.xlsx", sheet_name=None)
normalized = []
for name, df in raw.items():
df = df.rename(columns={"金額(円)": "Revenue", "商品名": "Product", "日付": "Date"})
if {"Date","Product","Revenue"}.issubset(df.columns):
normalized.append(df[["Date","Product","Revenue"]])
final = pd.concat(normalized, ignore_index=True)
print(final.head())
Pythonまとめ
- 全シートを辞書で読み込む →
sheet_name=None - dictのキーはシート名、値はDataFrame
- 全シートを結合するなら
pd.concat(dfs.values()) - シート名をラベル化して結合も可能
