PythonでExcelの表の空欄を見つけて一覧にする手順|未入力のセルを行と列で確かめる
PythonでExcelの表の空欄(未入力のセル)を見つけ、行と列の一覧にする手順を、pandasのコードと架空の表で試した結果で紹介します。空白だけのセルや「NA」という文字を取り違えない読み込み方と、つまずきやすいところも解説します。
本記事はプロモーションを含みます。紹介する情報は、実際の成果や効果を保証するものではありません。
目次
この記事でわかること
- Excelの表の必須の列から、空欄(未入力のセル)を見つけて、行と列の一覧にする手順
- 空白だけのセルや「NA」という文字を、空欄と取り違えない読み込み方
- 架空の表で試した結果と、一覧を見た後にすること
- つまずきやすいところと、Pythonで確かめるかの判断
注文や申し込みの一覧を受け取ると、担当や金額の欄が抜けていることがあります。行が多い表を目で追うと見落としやすく、後の集計で合計が合わない原因になります。この記事では、Pythonのpandasを使って、必須の列の空欄を見つけ、どの行のどの列が空いているかを一覧にする手順を紹介します。
コードの説明は、pandasの公式の資料(APIリファレンス)を2026年10月24日に読んで確かめたものです。コードは、作業PCで架空の表を使って実行し、結果を確かめています。
先に結論: 空白だけのセルも空欄に数え、「NA」の文字は残す
先に結論を書くと、必須の列だけを決めて、何もないセルと空白だけのセルを空欄として数え、行と列の一覧にします。「NA」のような文字は、空欄と取り違えないようにそのまま読みます。 扱いをまとめると、次のとおりです。
| 見つけるもの | 扱い |
|---|---|
| 何もないセル | 空欄にする |
| 空白だけのセル | 空欄にする |
| 「NA」の文字 | 文字のまま |
| 必須でない列 | 調べない |
| 結果 | 行と列の一覧 |
pandasが空欄をどう読むか
pandasのread_excelは、初期の設定では、空のセルだけでなく「NA」「N/A」「NULL」などの文字も、欠損値(NaN)として読みます。表の中に、本当に「NA」という文字を入れているセルがあると、それも空欄に数えてしまいます。
pandasの資料では、keep_default_naをFalseにし、na_valuesも指定しないと、どの文字も欠損値として読まないとしています。この設定にすると、空のセルは空の文字列として読まれ、「NA」は文字のまま残ります。
一方で、pandasの資料では、isnaは空の文字列を欠損値とみなさないとしています。そこで、この記事のコードは、isnaに加えて、セルの前後の空白を取った後の文字が空かどうかでも確かめます。
例に使う表
例として、架空の注文の一覧(orders.xlsx)を使います。実在の取引ではありません。見出しは1行目で、6件の注文が入っています。
- 列: 注文番号・担当・金額・納期(担当・金額・納期を必須の列とします)
- 入れておいた空欄: 担当が空の行、金額が空の行、納期が空の行、担当が空白だけの行
- 空欄ではない行: 担当に「NA」という文字を入れた行
重複した行の見つけ方は、PythonでExcelの重複データを見つける手順で紹介しています。
手順: 必須の列の空欄を一覧にする
次のコードは、orders.xlsxを読み、必須の列ごとに空欄の行を探して、Excelの行の番号・列の名前・注文番号の一覧を表示し、blank_list.xlsxに保存します。元のorders.xlsxは読むだけで、変更しません。
# 必須の列の空欄を見つけて、行と列の一覧にする
import pandas as pd
required = ["担当", "金額", "納期"]
orders = pd.read_excel("orders.xlsx", keep_default_na=False)
found = []
for col in required:
for i, value in orders[col].items():
if pd.isna(value) or str(value).strip() == "":
found.append({"行": i + 2, "列": col, "注文番号": orders.at[i, "注文番号"]})
blanks = pd.DataFrame(found, columns=["行", "列", "注文番号"])
print("表の行数", len(orders), "空欄の数", len(blanks))
print(blanks.to_string(index=False))
blanks.to_excel("blank_list.xlsx", index=False)
- required: 空欄を許さない列の名前です。必須でない列は調べません
- keep_default_na=False: pandasの資料では、na_valuesを指定せずにFalseにすると、どの文字も欠損値として読まないとしています。「NA」という文字を空欄と取り違えません
- pd.isna(value): 値が欠損値かどうかを確かめます。数値の列の空のセルなどを見つけます
- str(value).strip() == "": 前後の空白を取った文字が空かどうかを確かめます。空の文字列と、空白だけのセルを見つけます
- i + 2: pandasは1行目を見出しとして読み、データの行に0から番号を付けます。2を足すと、Excelの行の番号になります
- index=False: 一覧を保存するときに、pandasの行の番号を入れない指定です。pandasの資料によると、to_excelは何も指定しないとindexの列も書き出すため、ここで外して3つの列だけにします
架空の表で試した結果
架空の表で試すと、「表の行数 6 空欄の数 4」と表示されました。見つかったのは、担当の3行目と5行目、金額の4行目、納期の6行目です。5行目の担当は、空白だけが入ったセルでした。担当に「NA」と入れた6行目は、空欄に数えられませんでした。blank_list.xlsxには同じ4行が保存され、元のorders.xlsxは変わりませんでした。
このとき作業PCのPythonは3.12.10で、表を読むpandasは3.0.6、Excelのファイルを扱うopenpyxlは3.1.5を入れていました。資料は、確かめた日に公開されていたpandas 3.1.0の版を読んでいます。
一覧を見た後にすること
一覧ができたら、次の順で進めます。
- 一覧を表の作り手に渡す: どの行のどの列が空いているかを伝え、入るべき値を聞きます
- 入力してもらった表を、同じコードでもう一度確かめる: 空欄の数が0になったかを見ます
- それから集計する: 空欄が残ったまま合計を出すと、後で数字が合わない原因になります
日付の列が文字や数値になっているときの直し方は、PythonでExcelの日付を正しく読み込む手順で紹介しています。
Pythonで確かめるかの判断
迷ったときは、「同じ形の表を、くり返し確かめるか」で決めます。1回だけなら、Excelのフィルターで空白のセルを絞り込めば足ります。毎月届く表のように、同じ列を同じ基準で何度も確かめるなら、Pythonのコードにしておくと、確かめ方がぶれず、一覧もファイルに残せます。集計まで続けて行う流れは、PythonでCSVを集計する手順で紹介しています。
つまずきやすいところ
- 初期の設定のまま読む: 架空の表を初期の設定で読むと、担当の空欄は、空のセルと「NA」の文字の2つと数えられ、空白だけのセルは数えられませんでした
- isnaだけで探す: keep_default_na=Falseで読んだ表をisnaだけで調べると、空のセルは空の文字列になっているため、担当の列の空欄は1つも見つかりませんでした
- 行の番号をそのまま伝える: pandasの番号は0から始まり、見出しの行を数えません。Excelの行の番号として伝えるときは、見出しの位置に合わせて足します
- 見出しが1行目にない表を読む: pandasの資料では、read_excelは初期の設定で1行目(0番目の行)を列の名前に使うとしています。表の上にタイトルの行があるときは、headerで見出しの行を指定し、行の番号の足し方も合わせます
まとめ
- 空欄を許さない列だけを決めて、何もないセルと空白だけのセルを空欄として数えます
- read_excelは初期の設定で「NA」などの文字も欠損値にするため、keep_default_na=Falseで読み、空白を取った文字が空かどうかでも確かめます
- 結果は、Excelの行の番号・列の名前・注文番号の一覧にして保存し、表の作り手に渡します
- 入力してもらった後に同じコードでもう一度確かめ、空欄が0になってから集計します
よくある質問
Excelのフィルターで空欄を探すのと、何が違いますか?
1回だけ確かめるなら、Excelのフィルターで足ります。Pythonで確かめると、毎月届く表のように同じ確かめ方をくり返すときに、同じ列を同じ基準で調べ、空欄の行と列の一覧をファイルに残せます。
pandasのisnaだけで、空欄を見つけられますか?
読み込み方によっては見つけられません。pandasの資料では、空の文字列はisnaで欠損値とみなされないとしています。空のセルを空の文字列として読む設定にしたときや、空白だけのセルは、文字の前後の空白を取ってから空かどうかを確かめます。
表の中に「NA」と書かれたセルがあると、どうなりますか?
pandasのread_excelは、初期の設定では「NA」「NULL」などの文字も欠損値として読みます。そのため、「NA」という文字が入っているセルも空欄に数えられます。この記事のコードは、keep_default_na=Falseで、文字はそのまま読みます。
一覧の行の番号が、Excelの行の番号とずれます。なぜですか?
pandasは1行目を見出しとして読み、データの行に0から番号を付けるためです。見出しが1行目にある表なら、pandasの番号に2を足すとExcelの行の番号になります。この記事のコードは、2を足した番号を書き出しています。
見つけた空欄を、Pythonで自動で埋めてもよいですか?
この記事では埋めません。空欄に何が入るべきかは、表を作った人に聞かないと分からないことが多いためです。一覧を渡して、入力してもらってから、同じコードでもう一度確かめます。