Python Excel操作 逆引き集 | 既存のExcelをDataFrameの辞書で読み込む

Python
スポンサーリンク

Pythonで既存のExcelを「シートごとにDataFrameの辞書」で読み込む — pandas.read_excel(sheet_name=None)

Excelファイルには複数のシートが入っていることが多いですよね。pandas.read_excelsheet_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())
Python

2. 特定の複数シートだけ読み込む

dfs = pd.read_excel("sales.xlsx", sheet_name=["2025_Q1", "2025_Q2"])
print(dfs["2025_Q1"].head())
Python

3. 全シートを縦に結合して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)
Python

4. シート名を列に追加して結合

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())
  • シート名をラベル化して結合も可能
タイトルとURLをコピーしました