複数列に同じ処理―Power Query反復処理①


最初の頃は分からず、対象が多い場合、Excelのワークシートでコードを複製したりしてました。そんな必要はないわけです。

やろうとすること

後述のサンプルテーブルに対して、これの各列に同じ処理をしようというのが、今回の課題です。
簡単な例として、100を掛けてみましょう。

サンプルテーブル

下記を詳細エディタに貼ると、テーブルになります。

サンプル
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ZY7LEcAgCAV74ewBNRo9JimDof82osEPTA46zLo+HhFc4OBu5wF2BCdim8u6O+tz+EgeJCirDhZxe8dgkiYvHo1YjSgsTVGxaKpUtWQFeiXGzXZFm5h/v2cTB4KKath3Mb8=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1 = _t, 列1 = _t, 列2 = _t]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}})
in
    #"Changed Type"

↓こんなテーブルです。

A B C
700 800 800
0 200 600
200 800 900
300 200 400
700 300 1000
300 900 400
300 500 100
300 300 800
900 200 1000
100 300 300
1000 800 100
300 600 1000
1000 400 0
800 900 200

出発点:UI操作のみだと複数ステップを作るしかない

1列だと、UIの変換―標準のボタンが押せますが、複数列になると、グレーアウトしてしまいます。
1列ずつやれということらしいです。

UI操作+αでいく

1列でやったコードを列分複製するというてもありますが、ここは別の方法でやってみましょう。
というのも、まとめての掛け算はできないのに、平方根など他の処理だと、まとめて処理ができたりするからです。なので、平方根をやっておいて、コードを書き換えることもできます。

平方根をとる

UI操作:変換タブ―「数値の列」グループの「指数」―平方根
↓操作後の様子

コードを書き換える

{"A", Number.Sqrt, type number}といった部分の関数の箇所Number.Sqrtをそれぞれ、each _*100と書き換えるだけです。
この_(アンダーバー)のところに、その列の各値が引数として放り込まれるわけです。

↓出来上がり

コードで書く

UI+αではいずれにしても、各列に応じて書き直しが必要になります。
コードをしっかり書けば、繰り返し書く必要はなくなります。

全部の列を処理するコード

let
    Source = t_sample,
    Custom1 = Table.TransformColumns(Source,
                   List.Transform( Table.ColumnNames(Source),each {_,(x)=>x*100} )
              )
in
    Custom1

捕捉

上のコードのTable.ColumnNames(Source)の箇所は列名のリストです。この例だと、

{"A","B","C"}

と書くのと結果は同じです。このリストを書き換えることで、処理対象を絞ることが出来ます。
例えば、B列は処理したくない場合、

List.RemoveMatchingItems(
  Table.ColumnNames(Source),{"B"}
)

とすればよいです。
↓書き換えたバージョンの様子