Power Query 実務テンプレ | クレンジング(前処理)系:NULL を空白に統一

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Power Query で NULL(空値)を空白文字に統一する 実務テンプレ」です。
NULL が混ざっていると、次のようなトラブルが起きやすくなります。

  • 結合キーとして使うときに、NULL だけ結合されない
  • IF 条件で比較するときに、NULL が予期せず除外される
  • 集計時に「空白」と「NULL」が別扱いになり、件数がズレる

こうした問題を防ぐために、「NULL はすべて空白(””)に統一する」という前処理が非常に有効です。


NULL と空白の違いを正しく理解する

NULL は「値が存在しない」、空白は「値はあるが中身が空」

Power Query における NULL は、
「そのセルには値が存在しない」という“欠損値”の扱いです。

一方、空白("")は
「値はあるが、中身が空の文字列」という扱いです。

この違いが、JOIN・比較・集計で大きな差を生みます。

例えば、次の比較はすべて false になります。

null = ""
null = " "
null = null

つまり、NULL は「何とも一致しない」特殊な存在です。
だからこそ、前処理で「NULL → 空白」に統一しておくと、後工程が安定します。


例題の前提データをイメージする

次のようなテーブルを想像してください。

顧客コード顧客名電話番号
A001田中太郎null
A002null03-1234
null山田花子null

このまま JOIN や集計をすると、NULL が原因で意図しない結果になります。
ここで「NULL を空白に統一」すると、次のように整います。

顧客コード顧客名電話番号
A001田中太郎“”
A002“”03-1234
“”山田花子“”

これで、後続処理が安定します。


基本テンプレ:全列の NULL を空白に統一する

完成コードを先に示す

Power Query で「全列の NULL を空白に統一」する最も実務的なテンプレはこれです。

let
    Source = ・・・前のステップ・・・,

    // 1) 全列に対して「null → 空白」を適用する変換リストを作成
    TransformList =
        List.Transform(
            Table.ColumnNames(Source),
            (colName) =>
                {colName, each if _ = null then "" else _, type text}
        ),

    // 2) Table.TransformColumns で一括変換
    Replaced =
        Table.TransformColumns(
            Source,
            TransformList
        )
in
    Replaced
Power Query

ここから、初心者がつまずきやすいポイントを丁寧に解説します。


ステップごとの分解と深掘り

ステップ1:全列に対して「null → 空白」を適用する指示を作る

TransformList =
    List.Transform(
        Table.ColumnNames(Source),
        (colName) =>
            {colName, each if _ = null then "" else _, type text}
    ),
Power Query

ここでやっていることは次の通りです。

  • Table.ColumnNames(Source) で「全列名のリスト」を取得
  • List.Transform で「各列に対して同じ処理を適用する指示」を作る
  • 指示の内容は {列名, 変換関数, 型} の3つセット

変換関数 each if _ = null then "" else _ は、
「その列の値が null なら空白に、それ以外ならそのまま」という意味です。

ここでの重要ポイントは、
列名を手書きしないため、列が増えても自動で対応できる
ということです。

ステップ2:Table.TransformColumns で一括変換

Replaced =
    Table.TransformColumns(
        Source,
        TransformList
    )
Power Query

Table.TransformColumns は「指定した列に変換関数を適用する」関数です。
TransformList を渡すことで、全列に対して「null → 空白」が一括で適用されます。

この時点で、すべての NULL が空白に統一されたテーブルが完成します。


例題2:特定の列だけ NULL → 空白にしたい場合

「全列ではなく、顧客名と電話番号だけでいい」という場合は、もっとシンプルに書けます。

let
    Source = ・・・前のステップ・・・,

    Replaced =
        Table.TransformColumns(
            Source,
            {
                {"顧客名", each if _ = null then "" else _, type text},
                {"電話番号", each if _ = null then "" else _, type text}
            }
        )
in
    Replaced
Power Query

列が固定されている場合は、この書き方の方が読みやすいです。


例題3:NULL を空白ではなく「0」や「未入力」にしたい場合

NULL を空白ではなく、別の値に統一したいケースもあります。

例えば:

  • 数値列は NULL → 0
  • 文字列列は NULL → “未入力”

こうした場合も、変換関数を変えるだけです。

each if _ = null then "未入力" else _
Power Query

あるいは、

each if _ = null then 0 else _
Power Query

Power Query の変換は「列ごとに関数を指定する」だけなので、
NULL の扱いを柔軟に変えられます。


重要ポイントの深掘り

NULL を空白に統一するタイミング

NULL → 空白は、次のタイミングで行うのが最も安全です。

型変換(text 型への統一)をした直後
JOIN・集計・比較を行う前

理由はこうです。

  • text 型にしておかないと、空白(””)が扱えない列がある
  • JOIN の前に統一しておかないと、結合漏れが発生する
  • 集計前に統一しておかないと、「NULL と空白が別扱い」になる

NULL を空白にするのは「前処理の早い段階」に入れておくのが鉄則です。

NULL と空白を混ぜたままにすると何が起きるか

JOIN の例で見てみます。

左テーブル:顧客コード = null
右テーブル:顧客コード = “”

この場合、JOIN は一致しません。
つまり、「本当は同じ“空欄”なのに結合されない」という事故が起きます。

NULL を空白に統一しておけば、
両方とも "" になり、JOIN が正常に動きます。


実務テンプレとしてのまとめ

「NULL を空白に統一」の本質は、たった一言です。

“NULL は比較も結合もできない特殊値なので、前処理で空白に統一しておく”

これをテンプレとして持っておくと、
JOIN の結合漏れ、IF 条件の不一致、集計のズレなど、
実務でよくある“NULL 由来のトラブル”をほぼ防げます。

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