📊

カテゴリーごとに1から数え直すインデックスを付与したい

2024/02/26に公開

はじめに

Power Queryでテーブルにインデックス列を付ける際、特定の列の値が同じである(つまり同じカテゴリー内の)レコードに対し、1から数え直すインデックスを付けたい場合がある。

例えば以下のようにクラス名と生徒名が記載されている生徒名簿がある。
ただ出席番号の情報がないので、各クラスごとに名前のかな順で1から出席番号を自動で振りたい。

元データ

完成後のイメージはこちらになる。

テーブル

グループ化とカスタム列の組み合わせで実現可能

Power Queryでテーブルにインデックス列を付ける際、特定の列の値が同じである(つまり同じカテゴリー内の)レコードに対し、1から数え直すインデックスを付けるには、グループ化とカスタム列機能を組み合わせることで実現可能である。

実現手順

Power Queryのインデックス列の追加機能は、テーブル全体に対し一意のインデックスを追加するが、カテゴリー(クラス)ごとに1から数え直すインデックスを付与することはできない。
逆にいえば、クラスごとにテーブルを分けた状態でそれぞれにインデックス列の追加機能を使えばいい。
手順は以下になる。

手順1 名前順でレコード並び替える

同じクラス内で名前のかな順で出席番号を付けたいので、まずはかな順でレコードを並び替える必要がある。

並び替え

手順2 クラス名でグループ化

※グループ化機能の細かい紹介は以下をご参照ください。

https://learn.microsoft.com/ja-jp/power-query/group-by

グループ化対象列を「クラス名」列に、新しい列名を「GroupedTable」(他の名前でもいい)に、操作を「すべての行」に設定する。

グループ化

グループ化の結果が以下のようになっている。

グループ化後

各クラスのレコードがTable形式で「GroupedTable」列に保存されている。
例えばクラスAの「GroupedTable」列の値の中身は以下のようなテーブルになっている。
見ての通り、ステップ1の並び替えの結果が保持されている。

グループ化展開

グループ化することによって、クラスごとのテーブルが得られた。

手順3 インデックス列の追加

グループ化して得られたクラスごとのテーブルはそれぞれ親テーブルのセルに保存されているので、インデックス列追加のボタンをクリックしてインデックス列を追加することはできない。
それぞれのテーブルにインデックス列を追加するのに、以下のM言語式でカスタム列を追加する必要がある。

インデックス列の追加
Table.AddIndexColumn([GroupedTable], "出席番号", 1)
//注:GroupedTableは適宜にグループ化時に追加した列の名前に置き換えてください。s

カスタム列

そうするとテーブルが以下の形になる。

カスタム列追加

クラスAのカスタム列「IndexedSubTable」の中身が以下である。ちゃんと出席番号列が追加されている。

カスタム列展開

手順4 テーブルの展開と後片付け

親テーブルを生徒単位の粒度に戻すのと、出席番号の情報を取り出すため、「IndexedSubTable」列から「生徒名」、「生徒名(かな)」、「出席番号」列を展開する。

展開

最後に後片付けとして、不要となった「GroupedTable」列を削除する。

完成後のイメージはこちらになる。

展開後

参考

https://zenn.dev/bi_knowledge/articles/d68d0d4949815e#「グループ化」機能

https://learn.microsoft.com/ja-jp/powerquery-m/table-addindexcolumn

https://learn.microsoft.com/ja-jp/power-query/group-by

BIによる業務改善推進

Discussion