前回の連載に引き続き、今回も「条件列」の使い方を紹介していこう。「条件列」の出力値には、“特定の文字”だけでなく、“既存の列”を指定することも可能となっている。この機能を活用してデータチェックを行ったり、データの統廃合を行ったりする方法を紹介していこう。
「条件列」の応用的な使い方
今回は「条件列」の少し応用的な使い方を紹介していこう。前回の連載では、「△△の条件を満たすときは“☆☆”の文字を出力する」という具合に、各条件の出力値を“特定の文字”で指定した。
このほかにも、出力値の指定方法が何種類か用意されている。今回は、各条件の出力値に“既存の列”を指定する方法を紹介していこう。
なお、「条件列」の基本的な使い方は前回の連載で紹介しているので、よく分からない方は、先に第26回の連載を一読してから今回の連載を読み進めていくとよい。
「条件列」を使ったデータチェック
それでは、さっそく「条件列」の少し応用的な使い方を紹介していこう。最初に紹介するのは、不適切なデータをチェックする方法だ。
以下の図は、会員情報を記録したデータ表を「Power Query エディター」に取得した例だ。ただし、「メールアドレス」の列に不適切なデータが含まれている。具体的には、データが空白(null)のセル、「-」や「不明」と記録されているセル、メールアドレスとして機能しない文字列、などが含まれている。
「条件列」を使って、これらのデータを簡易的にチェックしてみよう。「列の追加」タブを選択し、「条件列」をクリックする。
「条件列」の設定画面が表示されるので、新たに作成する列の「列名」を指定する。今回は「チェック済みメール」という列名を指定した。
続いて、各処理の“条件”と“出力値”を指定していく。「メールアドレス」のデータには必ず「@」の文字が含まれるはずなので、「@」を含まないデータを“不適切なデータ”として処理する。ここでは、「@」を含まない場合は「★★★@なし」という値を出力、という処理を指定した。
「句の追加」をクリックして、2番目の処理を追加する。「メールアドレス」のデータには必ず「.」(ピリオド)も含まれているはずなので、「.」を含まない場合は「★★★ピリオドなし」という値を出力、という処理を追加する。
これで「@」や「.」を含まないデータを“不適切なデータ”として示すことができた。これら2つの条件だけではメールアドレスのチェックとして不十分かもしれないが、それ以上のチェックを行うのは非常に難しくなるので、ここでは簡易的に「@」と「.」の有無だけを確認することにする。
よって、上記の2条件をすり抜けたデータは“正しいメールアドレス”とみなして処理を進めていく。この処理は「それ以外の場合」で指定できる。前回の連載では、この出力値にも“特定の文字”を指定したが、今回は“既存の列”を指定してみよう。以下の図に示したアイコンをクリックし、「列の選択」を選択する。
すると、出力値に“既存の列”を指定できるようになる。たとえば「メールアドレス」を指定すると、「メールアドレス」の列に記録されているデータが、そのまま出力されるようになる。
「OK」ボタンをクリックして「条件列」を実行すると、以下の図に示したような列がデータ表の右端に追加される。
この列を「メールアドレス」の隣に移動して、各データを比較してみよう。「メールアドレス」のデータに応じて、以下の値が出力されていることを確認できるはずだ。
・「@」が含まれていない場合 ……… 「★★★@なし」
・「.」が含まれていない場合 ……… 「★★★ピリオドなし」
・それ以外の場合 ……………………… 元のデータをそのまま出力
このように処理しておくと、“不適切なデータ”を一目で判断できるようになる。“不適切なデータ”には「★★★」の文字が含まれているので、これを目安にデータを再加工していくことも可能だ。
適切と思われるデータだけにメールを送信するのであれば、各条件の出力値に「null」を指定してもよい。この場合、「@」や「.」を含まない“不適切なデータ”を「空白セル」として処理できるようになる。
ただし、「メールアドレス」のデータが空白セル(null)であった場合は、Errorとして処理される(上図の12行目)。このような結果になるのは、1番目の条件(@を含まない)を正しく判定できなかったことが原因だ。
空白セル(null)には「@」が含まれていないので「★★★@なし」が出力されるはず、と考える方も多いだろう。しかし、実際にはそうならない。nullの場合は「@」の有無を判断できない、とパワークエリは考えるようだ。よって、Errorが発生してしまう。
「条件列」を使用するときは、このようなルールがあることにも注意しておく必要がある。nullの扱いについては、以降に示す例でも詳しく紹介するので、その仕組みをよく確認しておくとよいだろう。
「条件列」を使ったデータの統廃合
続いては、データを統廃合する場合を例に「条件列」の応用的な使い方を紹介していこう。
以下の図に示したデータ表には、「固定電話」と「携帯電話」がそれぞれ個別に記録されている。ただし、データがnull(空白)のセルも多く見受けられる。そこで、これらの列を「電話番号」として1本化することにした。
昨今の事情を考えれば、「携帯電話」のデータだけを残して、「固定電話」のデータを削除する、というのが基本的な流れになるだろう。しかし、そうすると「固定電話」しか登録していないユーザーの連絡先が欠落してしまう。よって、「携帯電話」のデータがない場合は「固定電話」のデータを残す、という方針でデータを1本化することにした。これを「条件列」で実現してみよう。
「列の追加」タブを選択し、「条件列」をクリックする。「条件列」の設定画面が表示されるので、新たに作成する列の「列名」を入力する。今回は「電話番号」という列名を指定した。
続いて、各処理の“条件”と“出力値”を指定していく。1番目の処理は、「携帯電話」のデータがnull(空白)の場合の処理だ。この場合は「固定電話」のデータを出力値として採用すればよい。よって、「携帯電話」がnullに等しい場合は「固定電話の列」を出力、と指定する。
2番目の処理は、「携帯電話」の列に「-」や「なし」、「未登録」といった“不適切なデータ”が入力されていた場合の処理だ。この場合も「携帯電話」のデータなし、と考えられるが、null(空白)でないため、1番目の条件をすり抜けてしまう。よって、何らかの対策が必要となる。
「携帯電話」に“適切なデータ”が入力されていた場合、そのデータは必ず「0」で始まるはずだ。一方、「未登録」などの“不適切なデータ”は「0」以外の文字で始まる。これを条件に処理を指定していこう。具体的には、「携帯電話」が「0」で始まらない場合は「固定電話の列」を出力、と指定すればよい。
これで、「携帯電話のデータなし」→「固定電話のデータを出力」という処理を指定できた。それ以外は「携帯電話」のデータが正しく入力されていると考えられるので、「それ以外の場合」には「携帯電話の列」を指定する。
「OK」ボタンをクリックして「条件列」を実行し、データを比較しやすいように列を移動すると、以下の図のような結果が得られた。データの状況に応じて、出力される値が変化していることを確認できるはずだ。
◆「携帯電話」のデータが
・null(空白)の場合 ………… 「固定電話」のデータを出力
・「0」で始まらない場合 ……… 「固定電話」のデータを出力
・それ以外の場合 ……………… 「携帯電話」のデータをそのまま出力
これで「固定電話」と「携帯電話」を統廃合して、「電話番号」に1本化することができた。ちなみに、「携帯電話」と「固定電話」が両方ともnullの場合は、nullが出力されることになる。データが両方ともnull(空白)なので、これは仕方のない結果といえるだろう。
理解を深めるために、それぞれの処理を逆の順番で指定した例も紹介しておこう。この場合、nullの判定は2番目の処理で行われることになる。
結果は以下の図の通り。「携帯電話」がnull(空白)の行は、Errorという結果になってしまう。
このような結果になるのは、1番目の条件(0で始まらない)を判定する際にErrorが発生してしまうことが原因だ。前述したように、データがnullの場合、「△△を含む」とか「△△で始まる」などの条件は判定不能になってしまう。その結果、Errorが発生し、2番目の処理も実行されなくなる。
nullを含むデータを処理するときは、このような点にも配慮しておく必要がある。基本的な対処方法は、最初に「nullに等しいか?」の条件でnullを処理しておくこと。“他の条件”を先に指定すると、その時点でErrorが発生してしまう可能性があることに注意しなければならない。
ということで、最後に、今回の連載の主旨を再確認しておこう。
・「条件列」の出力値に“既存の列”を指定することも可能
・nullは最初に処理する
これら2点について学んでおけば、「条件列」の応用範囲が広がり、また不要なトラブルを回避できるようになると思われる。パワークエリの「条件列」を有効活用するテクニックとして、参考にして頂ければ幸いだ。