Python Excel操作 逆引き集 | コメント行(#など)を無視して読み込む

Python Python
スポンサーリンク

まず大事な前提:「comment=’#’ は read_excel では使えない」

ここが一番重要なポイントです。
comment='#' という引数は pandas.read_csv にはありますが、pandas.read_excel にはありません。

つまり、こういうコードはエラーになります。

import pandas as pd

# これはダメ(read_excel に comment 引数はない)
df = pd.read_excel("data.xlsx", comment="#")
Python

Excelファイルに対して「# で始まる行をコメントとして無視したい」ときは、
comment 引数ではなく、「読み込んだあとにコメント行を落とす」か
「読み込み時に skiprows で飛ばす」などの工夫が必要になります。

ここからは、「Excelにコメント行っぽい行があるとき、どう扱うか」を
現実的なやり方でテンプレート化していきます。


パターン1:先頭のコメント行をまとめて飛ばす(skiprows)

先頭がコメント行だけで、そのあとに表が続く場合

例えば、こんなシートを想像してください。

1行目: # 売上データ 2025年
2行目: # 出力日: 2025/01/01
3行目: 空行
4行目: 日付, 商品, 数量, 金額
5行目以降: データ

この場合、「1〜3行目はコメントや説明なので無視して、4行目から表として読みたい」わけです。

import pandas as pd

df = pd.read_excel(
    "sales.xlsx",
    skiprows=3,   # 先頭3行を飛ばす
    header=0      # 残った先頭行(元の4行目)をヘッダーにする
)

print(df.head())
Python

ここでは comment ではなく、skiprows で「コメント行をまとめて飛ばす」戦略を取っています。
「コメントが必ず先頭に固まっている」なら、このやり方が一番シンプルです。


パターン2:読み込んだあとで「# から始まる行」を落とす

コメント行が途中にも混ざっている場合

例えば、こういうデータを想像してください。

日付商品数量金額
2025/01/01りんご101200
## コメント行です
2025/01/02みかん5800

Excel上では、1列目に # が入っている行を「コメント行」として扱いたい、というケースです。
この場合は、一度普通に読み込んでから、条件で行を落とします。

import pandas as pd

df = pd.read_excel("sales_with_comment.xlsx")

# 1列目(または特定列)が '#' で始まる行を除外する例
first_col = df.columns[0]

mask = df[first_col].astype(str).str.startswith("#")
df_clean = df[~mask]

print(df_clean)
Python

ポイントは、「どの列を見てコメント行と判断するか」を自分で決めることです。
上の例では「一番左の列が # で始まる行はコメント」とみなしています。


パターン3:特定列に「# で始まるコメント」が入る場合

例えば「備考」列にコメント行が入っているケース

こんなイメージです。

日付商品数量備考
2025/01/01りんご10
2025/01/02みかん5# 要確認
2025/01/03バナナ8# キャンペーン対象

ここで、「備考が # で始まる行は、集計から除外したい」とします。

import pandas as pd

df = pd.read_excel("sales_with_notes.xlsx")

mask_comment = df["備考"].astype(str).str.startswith("#")
df_clean = df[~mask_comment]

print(df_clean)
Python

このように、「コメント行をどう定義するか」を自分で決めて、
その条件でフィルタリングするのが Excel+pandas の現実的なやり方です。


パターン4:どうしても「読み込み時に」弾きたいなら(高度テク)

skiprows に関数を渡すテクニック(ただし read_excel では制限あり)

read_csv では skiprows に関数を渡して「この行は飛ばす」ということができますが、
read_excel ではバージョンやエンジンによって挙動が変わり、安定しません。

そのため、Excelに対しては「読み込んでから落とす」方が安全です。
どうしても読み込み時に制御したい場合は、いったん read_excel で DataFrame にしてから、
必要なら CSV に書き出して read_csv(comment="#") を使う、という二段構えもありますが、
初心者向けにはあまりおすすめしません。


実践テンプレート

テンプレ1:先頭コメント行を飛ばしてから、日付と金額で月次集計

import pandas as pd

df = pd.read_excel(
    "sales_report.xlsx",
    skiprows=3,                 # 1〜3行目はコメント
    header=0,
    usecols=["日付", "金額"],
    parse_dates=["日付"]
)

df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

monthly = (
    df.assign(month=df["日付"].dt.to_period("M"))
      .groupby("month", as_index=False)["金額"].sum()
)

print(monthly)
Python

このテンプレートは、「先頭にコメントやタイトルがある帳票」を読むときの基本形です。
comment ではなく skiprows で対応している点がポイントです。

テンプレ2:途中に混ざるコメント行(#)を読み込み後に除外してから集計

import pandas as pd

df = pd.read_excel("sales_with_comment_rows.xlsx")

first_col = df.columns[0]
mask_comment = df[first_col].astype(str).str.startswith("#")
df_clean = df[~mask_comment]

df_clean["日付"] = pd.to_datetime(df_clean["日付"], errors="coerce")
df_clean["金額"] = pd.to_numeric(df_clean["金額"], errors="coerce")

monthly = (
    df_clean.assign(month=df_clean["日付"].dt.to_period("M"))
            .groupby("month", as_index=False)["金額"].sum()
)

print(monthly)
Python

ここでは、「コメント行を落とす → 型を整える → 集計する」という流れを明示的に書いています。
comment='#' が使えない分、自分で「コメントの定義」と「除外処理」を書くイメージです。


小さな練習問題

練習1:先頭2行が # で始まるコメントの sales.xlsx を正しく読む

条件は次の通りです。

  1. 1〜2行目はコメント行で無視したい
  2. 3行目にヘッダー(列名)がある
  3. skiprowsheader を組み合わせて、きれいな DataFrame にする

自分でコードを書いて、df.head()df.columns を確認してみてください。

練習2:途中に「# コメント行」が混ざる data.xlsx から、コメント行を除外して集計する

条件は次の通りです。

  1. 一番左の列が # で始まる行をコメント行とみなす
  2. 読み込み後にその行を除外する
  3. 残った行だけで、数値列の合計を計算する

ここまでできると、「Excelに紛れ込んだコメント行を、自分のルールで無視する」という感覚がかなり身についてきます。


最後に

comment='#' という便利な引数は、残念ながら read_excel にはありません。
でも、「コメント行とは何か?」を自分で定義して、skiprows やフィルタリングで落とすことで、
同じことを十分に実現できます。

大事なのは、

「どの行をコメントとみなすのか」
「それは先頭だけか、途中にもあるのか」

この2つをはっきりさせてから、
skiprows と「読み込み後の行フィルタ」を組み合わせて設計することです。

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