10

我一直认为这应该很容易,但答案却在逃避我。在 Excel Power Query 中,我想根据另一列的值转换列的每一行中的值。例如,假设我有 Table1 如下:

Column A | Column B
-------------------
X        | 1
Y        | 2

我想根据 B 列中的值转换 A 列中的值,而不必添加新列并替换原始 A 列。我尝试使用 TransformColumns 但输入只能是目标列的值 - 我可以'不要从 TransformColumns 函数中访问行/记录中的其他字段值。我希望能够做这样的事情:

=Table.TransformColumns(Table1, {"Column A", each if [Column B]=1 then "Z" else _ })

这将导致:

Column A | Column B
-------------------
Z        | 1
Y        | 2

我知道有办法做到这一点,但我试图找到一个步骤/转换最少的方法。例如,我知道我可以使用 Table.AddColumn 根据查看 B 列的函数添加的 A 列,但是我必须删除原始 A 列并将其替换为需要多个附加步骤的新 A 列.

4

6 回答 6

17

这是我最终这样做的方式:

Table1:
Column A | Column B
-------------------
X        | 1
Y        | 2

= Table.FromRecords(Table.TransformRows(Table1,
    (r) => Record.TransformFields(r,
        {"A", each if r[Column B]="1" then "Z" else _})))

结果:

Column A | Column B
-------------------
Z        | 1
Y        | 2

这样,您可以使用 Record.TransformFields 函数中的嵌套列表一次转换多个列。

于 2015-07-22T11:32:17.923 回答
6

另一种选择是:

= Table.ReplaceValue(Table1, each [Column A], each if [Column B]=1 then "Z" else [Column A] , Replacer.ReplaceText, {"Column A"})

该代码更具可读性,但一次只能应用于一列。

其中大部分可以通过使用 UI 生成,如下所示:http ://www.thebiccountant.com/2017/07/23/transforming-a-column-with-values-from-another-column-in-powerbi -and-powerquery-in-excel/

于 2017-07-23T06:07:38.507 回答
3

向 LoganTheSnowEater 致敬……我喜欢你的回答。您提到它可以针对多个操作进行扩展,我想发布一个示例,说明我如何成功地使用它来做到这一点:

#"Patch Records" = Table.FromRecords(Table.TransformRows(#"Sorted Rows",
(r) => Record.TransformFields( r, {
    {"Min Commit", each 
        if r[service_id] = "21430" then 81 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 46.9 else
        _},
    {"Installed", each 
        if r[service_id] = "21430" then 90 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 52 else
        _},
    {"Requested", each 
        if r[service_id] = "21430" then 90 else
        if r[service_id] = "24000" then 230 else
        if r[service_id] = "24008" then 18 else
        if r[service_id] = "24009" then 52 else
        _}})))

我唯一的惊喜是我必须在完成后重置所有数据类型,但回想起来这是有道理的。

ps 我没有足够的声誉点来将其发布为对解决方案的评论

于 2018-02-16T18:07:21.960 回答
3

为了建立 LoganTheSnowEater 的答案,这是一种使用 Table.FromRecords 中的第二个参数保留表列类型的方法,如M Reference中所指定:

Table1:
Column A | Column B
-------------------
    X    |    1
    Y    |    2

编辑:更新以使用更好的方法从使用 Value.Type 的表中提取表类型 - 此外,为了完整性,一次修改多个列。感谢 Value.Type 这个伟大的会议:https ://social.technet.microsoft.com/Forums/en-US/636e9b44-6820-4ff2-ab60-5dd6a5307bd2/type-conversion-mysteries

=Table.FromRecords(
    Table.TransformRows(
        Table1,
        (r) => 
        Record.TransformFields(
            r,
            {
                {"Column A", each if r[Column B]="1" then "Z" else _},
                {"Column B", each if r[Column A]="Y" then "99" else _}
            }
        )
    ),
    Value.Type(Table1)
)
于 2018-09-10T10:36:18.860 回答
1

抱歉,我编辑公式不太好,现在可以使用:

= Table.ReplaceValue(   #"Removed Columns", 
                   each [Contract Start Date],
                    each if [Contract Start Date] < #date(2019,01,01) then #date(2019,01,01) else
                          [Contract Start Date]
                    ,Replacer.ReplaceValue,
                    {"Contract Start Date"})
于 2019-03-08T11:29:17.147 回答
0

您无法使用这样的步骤来转换现有列。使用新列,进行转换,然后删除现有列。有什么大不了的?在 Excel 中,您也不希望公式更改不同列的值。在 Power Query 中,公式的结果也存储在列中,并且不能是提供公式输入值之一的列。

于 2015-07-21T21:37:35.587 回答