Power Query:通过乘以另一列来转换一列
Power Query: transform a column by multiplying by another column
我想做一些类似于 的事情,但我在如何为我的特定目标修改语法方面遇到困难。
与链接的问题类似,假设我有以下 table:
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
的多个序列,是否可以做到这一点?
我也尝试过基于this的Table.TransformColumns
,但无法获得实现此目的的正确语法。
假设这不需要 VBA and/or 编程,您可以只复制第一列中的值,然后突出显示第二列中的值,然后 "Paste Special..." > 相乘。
这将在您粘贴乘数的相同位置产生结果。
我认为 Table.AddColumn 后跟 Table.RemoveColumns 是这种转换的通常和最清晰的方式。我也不满意这会导致 PowerQuery 中有这么多步骤。
但由于 PowerQuery 的内部反向折叠方法,这通常不会带来更好的性能。 (如果可用,PowerQuery 会尝试将主要工作返回给查询的数据库)
Table.TransformColumns
不会给你 Column A
除非你可以索引回 table,这只有在你的列只有唯一数据时才有可能。
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 列,但如果您需要 B 到 Z,您可能需要更高级的逻辑来避免重复自己。
编辑:对于许多列更通用的解决方案是对除 "Column A"
.
之外的所有列名的转换列表使用 Record.TransformFields
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
我想做一些类似于
与链接的问题类似,假设我有以下 table:
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
的多个序列,是否可以做到这一点?
我也尝试过基于this的Table.TransformColumns
,但无法获得实现此目的的正确语法。
假设这不需要 VBA and/or 编程,您可以只复制第一列中的值,然后突出显示第二列中的值,然后 "Paste Special..." > 相乘。
这将在您粘贴乘数的相同位置产生结果。
我认为 Table.AddColumn 后跟 Table.RemoveColumns 是这种转换的通常和最清晰的方式。我也不满意这会导致 PowerQuery 中有这么多步骤。 但由于 PowerQuery 的内部反向折叠方法,这通常不会带来更好的性能。 (如果可用,PowerQuery 会尝试将主要工作返回给查询的数据库)
Table.TransformColumns
不会给你 Column A
除非你可以索引回 table,这只有在你的列只有唯一数据时才有可能。
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 列,但如果您需要 B 到 Z,您可能需要更高级的逻辑来避免重复自己。
编辑:对于许多列更通用的解决方案是对除 "Column A"
.
Record.TransformFields
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