この記事でわかること

  • 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の版を読んでいます。

一覧を見た後にすること

一覧ができたら、次の順で進めます。

  1. 一覧を表の作り手に渡す: どの行のどの列が空いているかを伝え、入るべき値を聞きます
  2. 入力してもらった表を、同じコードでもう一度確かめる: 空欄の数が0になったかを見ます
  3. それから集計する: 空欄が残ったまま合計を出すと、後で数字が合わない原因になります

日付の列が文字や数値になっているときの直し方は、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になってから集計します