Python Excel操作 逆引き集 | Excelファイルを複数シート読み込む

Python Python
スポンサーリンク

複数シート読み込みの全体像をつかむ

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())
Python

for 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 で結合する

という流れを自分の中でパターン化してしまうことです。

タイトルとURLをコピーしました