0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Power Query】ある列の値が条件を満たす場合に別の列の値で置換

0
Last updated at Posted at 2026-03-30

この記事は何か

この記事はタイトルの通り、Column2の値が特定の条件を満たすときにColumn1の値で置換する、という処理をPower Queryで行う方法を記載したものです。

ポイントは、「Table.TransformColumnsでは実現できない」 ため 「Table.AddColumn等で実装する必要がある」 という点です。

で、実はもう一点、この記事は、ChatGTPなどの公開AIの挙動について調べたい と思って書いている記事でもあります。この辺については後半で記載します。

やりたいこと

例えば以下のcsvがあって

"2026/4/1","2026/4/2",1
"2026/4/1","2026/4/3",2
"2026/4/2",,3
"2026/4/3","2026/4/5",4

このままPower Queryを使って、例えばExcelに取り込むと以下のようになるのを
image.png

Column2が空だったらColumn1の値で置換する処理を入れて、以下のように補完する、みたいな感じ。
image.png

まあ、よくあるやつかと。

実現方法

実現方法は単純で、PowerQuery(M言語)のif文を使って、置換処理を入れた列を追加します。

例えば、Power Query エディタから「カスタム列」を使用して以下のように列を追加。

image.png

カスタム列の式

= if [Column1] = null then [Column2] else [Column1]

詳細エディタを使う方は「Table.AddColumn」を使用してもOKです。

= Table.AddColumn(
    前のステップ名,
    "Column2_fix",
    each if [Column2] = null then [Column1] else [Column2],
    type text
)

で、私の場合は、すでにExcel側で処理を作った後だったので、追加した列がColumn2になるように、元のColumn2列を削除、追加した列の名前をColumn2に変更、という処理も追加しました。

最終的に全体は以下のような感じで
image.png

詳細エディタで見ると以下のような感じです。

let
    ソース = Csv.Document(File.Contents("D:\work\test.csv"),[Delimiter=",", Columns=3, Encoding=932, QuoteStyle=QuoteStyle.None]),
    変更された型 = Table.TransformColumnTypes(ソース,{{"Column1", type date}, {"Column2", type date}, {"Column3", Int64.Type}}),
    追加されたカスタム = Table.AddColumn(変更された型, "Column2_fix", each if [Column1] = null then [Column2] else [Column1]),
    変更された型1 = Table.TransformColumnTypes(追加されたカスタム,{{"Column2_fix", type date}}),
    削除された列 = Table.RemoveColumns(変更された型1,{"Column2"}),
    #"名前が変更された列 " = Table.RenameColumns(削除された列,{{"Column2_fix", "Column2"}}),
    並べ替えられた列 = Table.ReorderColumns(#"名前が変更された列 ",{"Column1", "Column2", "Column3"})
in
    並べ替えられた列

正直、記事にするほどのアレでもないのですが、とりあえずやり方は以上です。

この記事を作成した理由

さて、上で記事にするほどではない、といったのですが、それでもこの記事を作成した理由についてです。

実は、この記事を作成した時点(2026年3月30日)では、少なくとも、ChatGPTとMicrosoft Copilotは、この問題に間違った回答を返します。

以下はChartGTPとのやり取り。

  • 入力プロンプト

PowerQueryでColumn1の値がnullだった場合にColumn2の値で置換する、という処理を実装する方法を教えてください

  • 回答

方法①:既存のColumn1を上書き(おすすめ)

Table.TransformColumns を使う方法です。

= Table.TransformColumns(
    前のステップ名,
    {
        "Column1",
        each if _ = null then [Column2] else _,
        type any
    }
)

ですが、この方法(Table.TransformColumns)はうまくいかなくて、 そのあたりやり取りを進めると、最終的に以下のような回答が返ってきます。

方法①のこの書き方:

each if _ = null then [Column2] else _

は一見正しそうですが、TransformColumns の中では [Column2] が参照できません。

一応、方法②として本記事で行っているやり方も回答してくれるので、それほど困りはしないのですが、最初に間違った回答を行っているのは確かです。

ということで、試したいのは、本記事のリリースにより、この挙動が改善されるか です。

経験的に、QiitaのSEOは非常に強くて、この記事も「Power Query 特定の条件 別の列の値で置換」くらいのキーワード検索で、そこそこ上位に来るのではないかと思っています。

で、LLM系の公開AIがこの記事を参照して、間違った回答をしないようにならないかな、なったらちょっと素敵だな、と思いまして。

まあ、AIの内部の挙動はよくわからないので、なんとも言えないところではあるのですが、この記事の公開後しばらくしてから、同じプロンプトを投げてみようと思います。

さて、どうなるでしょうか。

確認結果【2026/04/07追記】

ということで、2026/04/07に試してみました。エージェントはChatGTPです。

  • 入力プロンプト

PowerQueryでColumn1の値がnullだった場合にColumn2の値で置換する、という処理を実装する方法を教えてください

  • 回答

方法①は省略。この記事と同じ列追加の方法が回答されました。
で、方法②が以下。

方法②:既存のColumn1を上書きする

元のColumn1を直接置き換えたい場合:

「詳細エディター」または「カスタム列追加→削除→リネーム」でもOK
Mコード例:

Table.TransformColumns(
    Source,
    {
        {"Column1", each if _ = null then [Column2] else _}
    }
)

⚠️ ただしこの書き方は、そのままだと [Column2] にアクセスできないのでエラーになります。
→ 実務では以下の方法の方が安全です👇

うーん。
エラーになる方法を回答に入れないでほしいのですが、一応、最初からできないことは明示されているので、改善はした、のかな…?

でも、なんというか、オモッテイタノト、チガウ…。

全体的な文章の構成から、なんとなく、この記事を参照している気はするのですが。

もしかして、後半にAIの話を入れてしまったので、全体がぼやけて、「Table.TransformColumnsでは実現できない」 という部分がストレートに読まれていない、とかあったりするのかな。
ちょっとわからないですが、少なくとも、今後はひとつの記事に二つの題材を混ぜるのは避けようとは思いました。AIの話は別にしても、そもそもが読みにくいですし。

なんとも中途半端な結果でスミマセンなのですが、この記事はこのくらいにしておきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?