4

我想做一些类似于Power Query Transform a Column based on another Column 的事情,但是我一直在为我的特定目标修改语法而陷入困境。

与链接的问题类似,假设我有下表:

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 5        | 8
 3       | 6        | 9

我不想以 B 列为条件更改 A 列的值,而是将多列(B 列和 C 列)中的值乘以 A 列中的值,并替换初始列中的值,以便我可以得到以下:

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 10       | 16
 3       | 18       | 27

这是否可以在不使用多个序列的情况Table.AddColumn下完成Table.RemoveColumns

我也尝试过Table.TransformColumns基于this,但无法获得正确的语法来实现这一点。

4

3 回答 3

6

Table.TransformColumns除非您可以索引回表,否则不会给您Column A,这只有在您的列只有唯一数据时才有可能。

Table.TransformRows将让您使用所需的任何逻辑构建新行:

let
    Source = Csv.Document("Column A,Column B,Column C
        1,4,7
        2,5,8
        3,6,9"),
    PromotedHeaders = Table.PromoteHeaders(Source),
    ChangedType = Table.TransformColumnTypes(PromotedHeaders,{{"Column A", type number}, {"Column B", type number}, {"Column C", type number}}),

    MultipliedRows = Table.FromRecords(Table.TransformRows(ChangedType, 
        each [
            Column A = [Column A],
            Column B = [Column A] * [Column B],
            Column C = [Column A] * [Column C]
        ]))
in
    MultipliedRows

这适用于列 B 和 C,但如果您需要 BZ,您可能需要更高级的逻辑以避免重复自己。

编辑:对于许多列,更通用的解决方案是Record.TransformFields在所有列名的转换列表上使用,除了"Column A".

let
    Source = Csv.Document("Column A,Column B,Column C,D,E,F
        1,4,7,1,2,3
        2,5,8,4,5,6
        3,6,9,7,8,9"),
    PromotedHeaders = Table.PromoteHeaders(Source),
    ChangedType = Table.TransformColumnTypes(PromotedHeaders,{{"Column A", type number}, {"Column B", type number}, {"Column C", type number}, {"D", type number}, {"E", type number}, {"F", type number}}),

    MultipliedRows = Table.FromRecords(Table.TransformRows(ChangedType, (row) => 
        let
            ColumnA = row[Column A],
            OtherColumns = List.RemoveItems(Record.FieldNames(row), {"Column A"}),
            Transforms = List.Transform(OtherColumns, (name) => { name, (cell) => cell * ColumnA })
        in
            Record.TransformFields(row, Transforms)))
in
    MultipliedRows
于 2015-08-08T09:18:02.673 回答
3

我认为 Table.AddColumn 后跟 Table.RemoveColumns 是这种转换的常用和最清晰的方法。我也不满意这会导致 PowerQuery 中出现如此多的步骤。但是由于 PowerQuery 的内部反向折叠方法,这通常不会带来更好的性能。(PowerQuery 尝试将主要工作返回给查询的数据库(如果可用))

于 2015-08-08T06:56:12.480 回答
0

假设这不需要是 VBA 和/或编程,您可以只复制第一列中的值,然后突出显示第二列中的值,然后“选择性粘贴...”> 相乘。

这将在您粘贴乘数的同一位置产生结果。

于 2015-08-07T21:18:43.900 回答