なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:テーブルの組み換えA(列のピボット解除・Table.Split)

入出力の区別がない表の場合、一覧表形式になっていることが多い。そしてそれがシート単位で増幅されていく悪循環に陥りやすい。

それは置いといて、これを列ごとに項目がまとまったテーブル情報に組み換えしたい時。横並びのデータが1種類だったら列のピボット解除一本で解決できる。ただ2列一組や3列一組となってくると単純にはいかない。

例えば、最初の一列だけが例外の2列一組のテーブル(テーブル1)だった場合どうするか。

まずは一般的とされる方法から。左端の「氏名」列以外を選択して列のピボット解除を実行。


    列のピボット解除 = Table.UnpivotOtherColumns(         テーブル1, {"氏名"}, "属性", "値"     ),

次に属性のいらない部分を列の分割で取り除く。今回は後ろの数字だけ除去する。


    列の分割 = Table.SplitColumn(         列のピボット解除, "属性",         Splitter.SplitTextByCharacterTransition(             (c) => not List.Contains({"0".."9"}, c), {"0".."9"}         ), {"属性"}     ),

続いて例によって行のグループ化+連番列挿入。


    行のグループ化 = Table.Group(列の分割, {"氏名", "属性"}, {         "テーブル",         each Table.AddIndexColumn(_, "連番", 1, 1),         type table [氏名=text, 属性=text, 値=any, 連番=number]     }),

テーブル列以外を削除してから、列を展開。

    不要列の削除 = Table.RemoveColumns(
        行のグループ化,{"氏名", "属性"}
    ),
    テーブル列の展開 = Table.ExpandTableColumn(
        不要列の削除, "テーブル", {"氏名", "属性", "値", "連番"}
    ),

列のピボット(集計しない)を実行して、連番列を削除。


    列のピボット = Table.Pivot(         テーブル列の展開,         List.Distinct(テーブル列の展開[属性]),         "属性", "値"     ),     連番列の削除 = Table.RemoveColumns(列のピボット,{"連番"})

というのが一応のパターンなんだけども(長かった)。Table.Splitを使ってやれば、列のピボット解除から先の展開が楽になる。

    列のピボット解除 = Table.UnpivotOtherColumns(
        テーブル1, {"氏名"}, "属性", "値"
    ),
    テーブル分割 = Table.Split(列のピボット解除, 2),
    リスト編集 = List.Transform(テーブル分割, each
        Table.FromRows(
            {{[氏名]{0}} & [値]},
            type table [氏名=text, 品目=text, 数量=number]
        )
    ),
    テーブル結合 = Table.Combine(リスト編集)

リストを編集したり、リストからテーブルを作成したりするのには、多少慣れが必要だとは思う。ただどうせ避けては通れない道なんだし、必要を感じた時が勉強のタイミングではないかな。

learn.microsoft.com