まず大事な前提:「comment=’#’ は read_excel では使えない」
ここが一番重要なポイントです。comment='#' という引数は pandas.read_csv にはありますが、pandas.read_excel にはありません。
つまり、こういうコードはエラーになります。
import pandas as pd
# これはダメ(read_excel に comment 引数はない)
df = pd.read_excel("data.xlsx", comment="#")
PythonExcelファイルに対して「# で始まる行をコメントとして無視したい」ときは、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 | りんご | 10 | 1200 |
| # | # コメント行です | ||
| 2025/01/02 | みかん | 5 | 800 |
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〜2行目はコメント行で無視したい
- 3行目にヘッダー(列名)がある
skiprowsとheaderを組み合わせて、きれいな DataFrame にする
自分でコードを書いて、df.head() と df.columns を確認してみてください。
練習2:途中に「# コメント行」が混ざる data.xlsx から、コメント行を除外して集計する
条件は次の通りです。
- 一番左の列が
#で始まる行をコメント行とみなす - 読み込み後にその行を除外する
- 残った行だけで、数値列の合計を計算する
ここまでできると、「Excelに紛れ込んだコメント行を、自分のルールで無視する」という感覚がかなり身についてきます。
最後に
comment='#' という便利な引数は、残念ながら read_excel にはありません。
でも、「コメント行とは何か?」を自分で定義して、skiprows やフィルタリングで落とすことで、
同じことを十分に実現できます。
大事なのは、
「どの行をコメントとみなすのか」
「それは先頭だけか、途中にもあるのか」
この2つをはっきりさせてから、skiprows と「読み込み後の行フィルタ」を組み合わせて設計することです。
