複数シート読み込みの全体像をつかむ
pandas.read_excel("file.xlsx", sheet_name=None) は、
「Excelファイルの全シートを、一気に読み込んで、dict(辞書)として受け取る」ための書き方です。
戻り値は DataFrame ではなく、次のような構造になります。
{
"Sheet1": DataFrame(...),
"Sheet2": DataFrame(...),
"2025_Q1": DataFrame(...),
...
}
Pythonキーがシート名、値がそのシートの DataFrame。
ここを理解しておくと、「シートごとに処理する」「全部まとめて結合する」が自然に書けるようになります。
基本形:全シートを辞書として読み込む
最小コードと中身の確認
import pandas as pd
dfs = pd.read_excel("book.xlsx", sheet_name=None)
print(type(dfs)) # <class 'dict'>
print(dfs.keys()) # シート名の一覧
print(dfs["Sheet1"].head()) # 特定シートの先頭5行
Pythonここで大事なのは、「dfs は DataFrame ではない」という感覚です。dfs["Sheet1"] のように、まずシート名で取り出してから DataFrame として扱います。
どんなときに sheet_name=None を使うか
複数シートを持つ Excel で、次のようなパターンがあるときに特に有効です。
- 四半期ごとにシートが分かれている(
Q1,Q2,Q3,Q4など) - 年ごとにシートが分かれている(
2023,2024,2025など) - 店舗ごと・支店ごとにシートが分かれている
「全部同じ構造のシートを、まとめて処理したい」ときに、sheet_name=None が一番きれいに書けます。
全シートをループして処理する
シートごとに同じ処理をかける
import pandas as pd
dfs = pd.read_excel("sales.xlsx", sheet_name=None)
for name, df in dfs.items():
print(f"=== {name} ===")
print(df.head())
Pythonfor name, df in dfs.items(): という書き方で、name にシート名、df にそのシートの DataFrame が順番に入ってきます。
ここに「共通の前処理」や「集計」を書いていくのが定番パターンです。
読み込み時のオプションを同時に使う
全シートに対して、同じ列選択や日付パースをしたい場合は、read_excel の時点で指定してしまいます。
dfs = pd.read_excel(
"sales.xlsx",
sheet_name=None,
usecols=["Date", "Product", "Revenue"],
parse_dates=["Date"]
)
Pythonこうしておくと、dfs に入っているすべての DataFrame が、同じ列構成・同じ型で揃います。
後で結合するときに、ここが揃っているかどうかが効いてきます。
全シートを一つの DataFrame に結合する
単純に縦にくっつける
「全シートが同じ列構成」であれば、pd.concat で一気に縦結合できます。
import pandas as pd
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.head())
print(all_sales.shape)
Pythonここで重要なのは、dfs.values() で「辞書の値(= 各シートの DataFrame)」だけを取り出していることです。ignore_index=True を付けることで、結合後のインデックスを 0 から振り直します。
シート名を列として残しながら結合する
「どのシートのデータだったか」を後で使いたい場合は、結合前にシート名を列として埋め込んでおきます。
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 = df.copy()
df["sheet"] = name # ここでシート名を列に追加
frames.append(df)
all_sales = pd.concat(frames, ignore_index=True)
print(all_sales.head())
Pythonこうしておくと、例えば「シート名 = 四半期名」として、四半期ごとの集計が簡単に書けます。
summary = all_sales.groupby("sheet", as_index=False)["Revenue"].sum()
print(summary)
Pythonシート構造が少し違う場合の扱い方
列名が微妙に違うシートを正規化してから結合する
現場では、「シートによって列名が微妙に違う」ことがよくあります。
その場合は、読み込み後に列名を揃えてから結合します。
import pandas as pd
raw = pd.read_excel("report.xlsx", sheet_name=None)
normalized = []
for name, df in raw.items():
df = df.rename(columns={
"日付": "Date",
"商品名": "Product",
"金額(円)": "Revenue",
"金額": "Revenue"
})
if {"Date", "Product", "Revenue"}.issubset(df.columns):
normalized.append(df[["Date", "Product", "Revenue"]])
all_data = pd.concat(normalized, ignore_index=True)
print(all_data.head())
Pythonポイントは二つです。
ひとつは、rename で「日本語や揺れのある列名」を共通の英語名に寄せていること。
もうひとつは、issubset で「必要な列が揃っているシートだけを結合対象にしている」ことです。
特定のシートだけを選んで読む
「全部のシートはいらない、いくつかだけでいい」という場合は、sheet_name にリストを渡します。
import pandas as pd
dfs = pd.read_excel(
"sales.xlsx",
sheet_name=["2024_Q1", "2024_Q2"],
usecols=["Date", "Revenue"],
parse_dates=["Date"]
)
print(dfs.keys()) # dict_keys(['2024_Q1', '2024_Q2'])
print(dfs["2024_Q1"].head())
Pythonこの場合も戻り値は辞書ですが、含まれるのは指定したシートだけです。
「対象シートが決まっているなら、最初から絞る」が鉄則です。
実践テンプレートでイメージを固める
テンプレ1:四半期ごとのシートをまとめて年間売上を出す
import pandas as pd
dfs = pd.read_excel(
"year_sales.xlsx",
sheet_name=None, # 全シート
usecols=["Date", "Revenue"],
parse_dates=["Date"]
)
frames = []
for name, df in dfs.items():
df = df.copy()
df["quarter"] = name # シート名を四半期ラベルとして使う
frames.append(df)
all_sales = pd.concat(frames, ignore_index=True)
summary = all_sales.groupby("quarter", as_index=False)["Revenue"].sum()
print(summary)
Pythonこのテンプレートは、「Q1〜Q4 のシートをまとめて、四半期別の売上合計を出す」という典型パターンです。
シート名の付け方を工夫すれば、そのままラベルとして使えます。
テンプレ2:店舗ごとのシートを結合して、店舗別ランキングを出す
import pandas as pd
dfs = pd.read_excel(
"stores.xlsx",
sheet_name=None,
usecols=["Date", "Store", "Revenue"],
parse_dates=["Date"]
)
all_data = pd.concat(dfs.values(), ignore_index=True)
store_summary = (
all_data.groupby("Store", as_index=False)["Revenue"]
.sum()
.sort_values("Revenue", ascending=False)
)
print(store_summary.head())
Pythonここでは、シート名ではなく、シート内の「Store」列を使って店舗別集計をしています。
「シートごとに分かれているけれど、列に店舗名が入っている」ような帳票でよく使う形です。
小さな練習問題
練習1:全シートの「Date」「Amount」だけを読み、全部まとめて月次合計を出す
条件は次の通りです。
sheet_name=Noneで全シートを辞書として読むusecols=["Date", "Amount"]とparse_dates=["Date"]を使う- 全シートを縦に結合して一つの DataFrame にする
- 月ごとの合計金額を出して表示する
自分で書いてみて、「どこでつまずいたか」を意識してみてください。
もし詰まったら、その部分だけ教えてくれれば、そこをピンポイントで一緒にほぐします。
練習2:シート名を「year」列として埋め込み、年別売上を出す
次の条件でコードを書いてみてください。
- 各シートの名前が「2023」「2024」「2025」になっていると仮定する
sheet_name=Noneで読み込む- 結合前に、各 DataFrame に
year列としてシート名を追加する - 結合後、
yearごとの売上合計を出す
ここまでできると、「複数シートの Excel をどう料理するか」がかなり見えてきます。
最後に
sheet_name=None は、「Excelをシート単位で丸ごと受け取る」ための強力な入口です。
大事なのは、戻り値が「辞書」であることをちゃんと意識して、
- まずシートごとに共通の前処理をかける
- 必要ならシート名を列として埋め込む
- 条件が揃ったものだけを
concatで結合する
という流れを自分の中でパターン化してしまうことです。
