Excelファイルから欲しいデータだけ取り出す

# METI:経済産業省の石油統計速報(令和8年1月分)のExcelファイルのパス
https://www.meti.go.jp/statistics/tyo/sekiyuso/result.html
Excel/46KB からダウンロードしたファイルを扱いやすいように加工する。

【目標】赤枠で囲った場所だけデータを取り出したい
・原油輸入明細(2頁目) ※下図
・需給概要(5頁目) ※図なし

コメント最小限のコードです。

import pandas as pd
from pathlib import Path

# METI:経済産業省の石油統計速報(令和8年1月分)のExcelファイルのパス
# https://www.meti.go.jp/statistics/tyo/sekiyuso/result.html
EXCEL_PATH = Path(__file__).parent / "h2j581011j.xlsx"

# ====================================================================================
def read_genyu_yunyu_meisai(excel_path: str | Path = EXCEL_PATH) -> pd.DataFrame:

    df_excel = pd.read_excel(excel_path, sheet_name='原油輸入明細(2頁目)', header=None)

    mask = (
        df_excel[1].notna() & (df_excel[1].astype(str).str.strip() != "") &
        df_excel[3].notna() & (df_excel[3].astype(str).str.strip() != "")
    )
    df_filtered = df_excel[mask].copy()

    df_result = df_filtered[[1, 3, 7, 9]].copy()
    df_result.columns = ["B列", "D列", "H列", "J列"]

    return df_result

# ====================================================================================
def read_jyukyu_gaiyo(excel_path: str | Path = EXCEL_PATH) -> pd.DataFrame:

    df_excel = pd.read_excel(excel_path, sheet_name='需給概要(5頁目)', header=4)
    df_excel = df_excel.rename(columns={'Unnamed: 0': '区分'})
    df_excel = df_excel.drop(columns=['Unnamed: 1'])
    df_excel = df_excel[df_excel['区分'].notna()]

    new_columns = []
    for col,tani in zip(df_excel.columns,list(df_excel.iloc[0])):
        if col == "区分":
            new_columns.append(col)
        else:
            new_columns.append(f"{col}[{tani}]")
    df_excel.columns = new_columns

    df_excel = df_excel.drop(index=-0)
    df_result = df_excel.copy()

    return df_result

# ====================================================================================
if __name__ == "__main__":
    if not EXCEL_PATH.exists():
        print(f"ファイルが見つかりません: {EXCEL_PATH}")
        print("h2j581011j.xlsx をこのスクリプトと同じフォルダに置くか、EXCEL_PATH を変更してください。")
    else:
        # 原油輸入明細(2頁目)
        df = read_genyu_yunyu_meisai()
        print(df)
        df.to_excel("原油輸入明細.xlsx", index=False)
        print("--------------------------------")
        # ---------------------------------------------------------------
        # 需給概要(5頁目)
        df = read_jyukyu_gaiyo()
        print(df)
        df.to_excel("需給概要.xlsx", index=False)
        print("--------------------------------")

コメント付きのコードです

# ---------------------------------------------------------------------------
# このスクリプトは経済産業省の石油統計速報Excelから
# 「原油輸入明細」と「需給概要」のシートを読み込み、使いやすい形で返したり
# 別のExcelファイルとして保存したりします。
# ---------------------------------------------------------------------------

import pandas as pd   # Excelや表データを扱うためのライブラリ
from pathlib import Path   # ファイルパスをOSに依存せず扱うためのライブラリ

# ---------------------------------------------------------------------------
# 定数(プログラム内で変更しない値)
# ---------------------------------------------------------------------------
# METI:経済産業省の石油統計速報(令和8年1月分)のExcelファイルのパス
# https://www.meti.go.jp/statistics/tyo/sekiyuso/result.html
#
# Path(__file__)  … このPythonファイル自身のパス
# .parent         … その親フォルダ(このスクリプトが入っているフォルダ)
# / "h2j581011j.xlsx"  … そのフォルダ内のファイル名を連結
# 結果として「このスクリプトと同じ場所にある h2j581011j.xlsx」を指します。
EXCEL_PATH = Path(__file__).parent / "h2j581011j.xlsx"

# ====================================================================================
# 関数: 原油輸入明細(2頁目)を読み込む
# ====================================================================================
def read_genyu_yunyu_meisai(excel_path: str | Path = EXCEL_PATH) -> pd.DataFrame:
    """
    原油輸入明細シートを読み、B列・D列・H列・J列だけを抽出して返します。
    空行や必要な列が空の行は除外します。

    引数:
        excel_path: 読み込むExcelファイルのパス(省略時は EXCEL_PATH を使用)

    戻り値:
        pandasのDataFrame(表形式のデータ)
    """

    # Excelの「原油輸入明細(2頁目)」シートを読み込む
    # header=None は「1行目を列名として使わない」という意味(列は 0, 1, 2... の番号で参照)
    df_excel = pd.read_excel(excel_path, sheet_name='原油輸入明細(2頁目)', header=None)

    # 「マスク」: どの行を残すかを True/False で表した条件
    # ・df_excel[1].notna()  … 1列目(B列)が欠損(NaN)でない
    # ・.astype(str).str.strip() != ""  … 文字列に直して空白を除いたとき、空でない
    # 1列目と3列目(B列とD列)の両方に値がある行だけを残すための条件です。
    mask = (
        df_excel[1].notna() & (df_excel[1].astype(str).str.strip() != "") &
        df_excel[3].notna() & (df_excel[3].astype(str).str.strip() != "")
    )
    # 条件に合う行だけを抜き出し、.copy() で別の表としてコピー(元の df_excel を変更しない)
    df_filtered = df_excel[mask].copy()

    # 必要な列だけを選ぶ(1, 3, 7, 9 は Excel の B, D, H, J 列に相当)
    df_result = df_filtered[[1, 3, 7, 9]].copy()
    # 列名を分かりやすく「B列」「D列」などに付け直す
    df_result.columns = ["B列", "D列", "H列", "J列"]

    return df_result

# ====================================================================================
# 関数: 需給概要(5頁目)を読み込む
# ====================================================================================
def read_jyukyu_gaiyo(excel_path: str | Path = EXCEL_PATH) -> pd.DataFrame:
    """
    需給概要シートを読み、列名を整理して返します。
    5行目をヘッダーとし、6行目の単位を列名に反映します。

    引数:
        excel_path: 読み込むExcelファイルのパス(省略時は EXCEL_PATH を使用)

    戻り値:
        pandasのDataFrame(表形式のデータ)
    """

    # 「需給概要(5頁目)」シートを読み込む
    # header=4 は「0始まりで5行目(4行目)を列名として使う」という意味
    df_excel = pd.read_excel(excel_path, sheet_name='需給概要(5頁目)', header=4)

    # 列名の整理: pandas が自動で付けた 'Unnamed: 0' を分かりやすい「区分」に変更
    df_excel = df_excel.rename(columns={'Unnamed: 0': '区分'})
    # 不要な列 'Unnamed: 1' を削除
    df_excel = df_excel.drop(columns=['Unnamed: 1'])
    # 「区分」が空(NaN)の行は表の区切りや余白なので除外する
    df_excel = df_excel[df_excel['区分'].notna()]

    # 列名に「単位」を付け足す(Excelの1行目=iloc[0]に単位が書いてある想定)
    # zip(列名のリスト, 1行目の値のリスト) で、列ごとに「列名」と「単位」をペアで取り出す
    new_columns = []
    for col, tani in zip(df_excel.columns, list(df_excel.iloc[0])):
        if col == "区分":
            new_columns.append(col)   # 区分列はそのまま
        else:
            new_columns.append(f"{col}[{tani}]")   # 例: "生産量[万kl]"
    df_excel.columns = new_columns

    # 単位が入っていた行(先頭行)をデータから削除する(iloc[0] が index 0 の行)
    # 注: index=-0 は 0 と同じなので、先頭行が削除される
    df_excel = df_excel.drop(index=-0)
    df_result = df_excel.copy()

    return df_result

# ====================================================================================
# このスクリプトを「直接」実行したときだけ以下が動く
# (他のファイルから import したときは動かない)
# ====================================================================================
if __name__ == "__main__":
    # まず Excel ファイルが存在するか確認する
    if not EXCEL_PATH.exists():
        print(f"ファイルが見つかりません: {EXCEL_PATH}")
        print("h2j581011j.xlsx をこのスクリプトと同じフォルダに置くか、EXCEL_PATH を変更してください。")
    else:
        # --- 原油輸入明細(2頁目)の処理 ---
        df = read_genyu_yunyu_meisai()
        print(df)
        # 読み込んだ表を新しいExcelファイルとして保存する
        # index=False は「行番号(0, 1, 2...)をExcelの左端の列に書き出さない」という指定
        df.to_excel("原油輸入明細.xlsx", index=False)
        print("--------------------------------")

        # --- 需給概要(5頁目)の処理 ---
        df = read_jyukyu_gaiyo()
        print(df)
        # 同様に需給概要の表もExcelファイルとして保存する
        df.to_excel("需給概要.xlsx", index=False)
        print("--------------------------------")

結果です。

「需給概要(5頁目)」のシートからデータを取り出した結果です。

以上です。