Power Queryの「重複の削除」は、選んだ列の値が同じ行を1行だけ残し、残りを削除する機能です。操作は簡単ですが、次の2つの理由で結果が思ったとおりにならないことがあります。
- どの列を選ぶか(キー列)で、消える行が大きく変わる
- Power Queryは文字を厳密に比べるため、見た目が同じでも大文字・小文字や前後の空白が違うと、別の値として扱う
この記事では、キー列の決め方、基本の操作、重複が残るときの直し方、削除前後の件数の確認を順に説明します。
削除の前に決めること:何をもって「同じ」とするか
最初に決めるのは、「どの列の値が同じなら、同じ1件とみなすか」です。この列をキー列と呼びます。
| やりたいこと | キー列の例 | 注意点 |
|---|---|---|
| 顧客一覧で同じ顧客を1件にする | 顧客ID | IDがない場合は、メールアドレスなど1人に1つの値を使う |
| 二重に取り込んだ明細を消す | 伝票番号+行番号、またはすべての列 | 取込日時の列があると、全列で比べても重複にならない |
| 月ごとの取引先一覧を作る | 年月+取引先コード | 年月を入れないと、月をまたいだ分も1件になる |
避けたいのは、氏名や会社名だけをキーにすることです。同姓同名の別人や、同じ名前の別の会社が1件にまとめられてしまいます。名前しか手がかりがない場合は、自動で削除せず、重複の候補として人が確認する作業になります。
逆に、すべての列で比べると、更新日時や備考など1列だけ違う行は重複と判定されずに残ります。明細の二重取り込みのように、完全に同じ行だけを消したいならそれでかまいません。「同じ顧客を1件に」したい場合は、キー列を絞ります。
基本の操作
重複を削除する前の状態と削除後の状態を比べられるように、クエリを分けておくと確認が楽になります。整形までを行うクエリを「参照」で新しく作り、そちらで重複を削除します。
- 整形済みのクエリを右クリックし、「参照」で新しいクエリを作る
- キー列を選ぶ(複数の列はCtrlキーを押しながら見出しをクリック)
- [ホーム]→[行の削除]→「重複の削除」を選ぶ
- 数式バーの式で、対象の列を確認する
- 削除前と削除後の行数を比べる(後述)
手順3を実行すると、数式バーに次のような式が入ります。
= Table.Distinct(ソース, {"顧客ID"})
{ } の中が、比較に使われる列です。列の指定がない Table.Distinct(ソース) は、すべての列を比べます。
消す前に、重複している行を見ておく
削除する前に、どの行が重複しているかを見ておくと安心です。確認用にもう1つ「参照」でクエリを作り、キー列を選んで[ホーム]→[行の保持]→「重複の保持」を選びます。キーが2件以上ある行だけが残ります。
どの行が残るか
重複の削除では、同じキーの行のうち1行だけが残り、ほかの列の値もその行のものになります。例えば、同じ顧客IDで住所が違う2行があると、片方の住所は消えます。
「最新の行を残したい」など、残す行を指定したい場合は並べ替えと組み合わせることになります。ただし、並べ替えた順番どおりに残らないことがあるため、別の手順での確認が必要です。キー列以外の値が行ごとに違う場合は、どちらの値が残っても困らないかを先に確認してください。
重複が残るときに疑う5つの違い
「同じに見える値なのに消えない」ときは、ほとんどの場合、値がどこか違っています。
| 違い | 例 | 見分け方 |
|---|---|---|
| 大文字・小文字 | 「Sato@Example.jp」と「sato@example.jp」 | 並べて見ると分かる |
| 前後の空白 | 「山田商事」と「山田商事 」 | 文字数を比べる |
| 全角スペース・改行・特殊な空白 | 末尾の全角スペース、セル内改行、Webページからコピーした空白 | 文字数を比べる |
| データ型 | 数値の 1 とテキストの「1」、「001」 | 列見出しの左にある型のアイコンを見る |
| null と空の文字列 | 何も入っていないセル(null)と、長さ0の文字列 | 「null」と表示されるかどうかを見る |
Excelのワークシートの「重複の削除」では大文字・小文字の違いを同じ値として扱いますが、Power Queryでは別の値として扱います。Excelでは消えた重複がPower Queryでは残る場合、多くはこの違いです。
空白が原因かどうかは、[列の追加]→「カスタム列」で次の式を入れて文字数を比べると分かります。
Text.Length([会社名])
見た目が同じなのに文字数が違えば、どこかに空白や見えない文字が入っています。
比べる値をそろえて重複を消す
方法1:そろえたキー列を作ってから削除する(おすすめ)
元の列はそのまま残し、比較用の列を別に作って、その列で重複を削除する方法です。何をそろえたかが列として見えるので、後から確認しやすくなります。
[列の追加]→「カスタム列」で、列名を「照合キー」などにして次の式を入れます。
Text.Lower(Text.Trim([メールアドレス]))
- Text.Trim:前後の空白を取り除く
- Text.Lower:英字をすべて小文字にする
作った「照合キー」列を選んで「重複の削除」を実行します。元の「メールアドレス」列は、表示や出力用にそのまま残ります。確認が終われば、照合キー列は削除してもかまいません。
文字数を比べても全角スペースや改行が残っている場合は、取り除く文字を指定します。
Text.Lower(Text.Trim(Text.Clean([メールアドレス]), {" ", " ", "#(00A0)"}))
- Text.Clean:改行などの制御文字を取り除く
- Text.Trim の2つ目の引数:前後から取り除く文字を指定する(半角スペース、全角スペース、Webページからのコピーで入りやすい特殊な空白)
文字の途中にある空白(「山田 商事」と「山田商事」など)は、Text.Trim では消えません。途中の空白も無視してよいと決めた場合に限り、Text.Remove([会社名], {" ", " "}) のように取り除きます。
ただし、「株式会社」の有無や英数字の全角・半角まで合わせようとすると、それは重複の削除ではなく名寄せの作業です。自動で消してよいのは、「同じものだと確実に言える違い」だけに絞ります。
方法2:比較方法を指定して削除する
大文字・小文字の違いだけを無視したい場合は、Table.Distinct に比較方法を指定する書き方もあります。数式バーの式を次のように書き換えます。
= Table.Distinct(ソース, {"メールアドレス", Comparer.OrdinalIgnoreCase})
Comparer.OrdinalIgnoreCase は、大文字・小文字を区別せずに比べる指定です。照合キー列を作らずに済みますが、空白の違いには対応しません。また、式の中だけで処理されるため、何をそろえたのかが表からは見えません。
空白もそろえる必要がある場合や、ほかの人が引き継ぐクエリでは、方法1のほうが分かりやすいでしょう。どちらの方法でも、残った行の値は元の表記(大文字を含む表記など)のままです。
型の違いをそろえる
顧客IDのような列で数値とテキストが混ざっていると、同じIDでも重複になりません。キー列は、どちらかの型に統一してから比べます。
「001」のように先頭に0が付くIDは、テキスト型でそろえます。Power Queryが自動で追加する「変更された型」のステップで数値型になると、「001」も「01」も 1 になり、本来は別のIDが同じ値として扱われることがあります。キー列の型が意図どおりかを、列見出しの左のアイコンで確認してください。
空のキーに注意する
キー列が null の行は、すべて「同じ値」として扱われ、1行にまとめられます。キーが入っていない行が複数あると、それらが知らないうちに1行になります。
空の文字列も null として扱いたい場合は、照合キーを次のように作ります。
let t = Text.Lower(Text.Trim([メールアドレス])) in if t = "" then null else t
そのうえで、照合キーが null の行は重複の削除の対象から外し、別の一覧にして確認します。列のフィルターで null の行だけを表示すれば、件数と中身を見られます。
削除前後の件数を確認する
確認する数
| 確認する数 | 見方 |
|---|---|
| 削除前の行数 | 整形済みのクエリ(参照元)の行数 |
| 削除後の行数 | 重複を削除したクエリの行数 |
| 重複していた行数 | 「重複の保持」で残った行数 |
| 重複していたキーの種類 | 「重複の保持」の結果を、さらにキー列で重複削除した行数 |
行数は、対象のクエリを「参照」して新しいクエリを作り、[変換]→「行のカウント」を選ぶと確認できます。シートへの読み込み後は、[クエリと接続]ウィンドウに表示される行数でも確認できます。
差が合っているか
削除される行数は、「重複していた行数」から「重複していたキーの種類」を引いた数になります。例えば、2件ずつ重複しているキーが3種類あれば、「重複の保持」では6行が残り、削除されるのは3行です。次の式が成り立つかを確認します。
- 削除前の行数 − 削除後の行数 = 重複していた行数 − 重複していたキーの種類
照合キーを使った場合は、元の列のままで削除した結果とも行数を比べます。その差の分は、大文字・小文字や空白の違いによってまとまった行です。照合キーで「重複の保持」を実行してその行を一覧で見て、本当に同じものだったかを確かめてください。
まとめ:削除前の確認項目
- 「何が同じなら同じ1件か」を決め、キー列を選んだ
- 名前だけをキーにしていない
- 「重複の保持」で、消える候補の行を見た
- 大文字・小文字、前後の空白、型、null と空の文字列の違いを確認した
- そろえる処理は照合キー列で行い、元の列を残した
- キーが空の行を別に確認した
- 削除前後の行数の差が、重複の件数と合っていることを確認した
