我想做一些类似于Power Query基于Another Column转换一列的事情,但是我对如何修改特定目标的语法感到困惑。
与链接的问题类似,假定我具有下表:
Table 1:
Column A | Column B | Column C
------------------------------
1 | 4 | 7
2 | 5 | 8
3 | 6 | 9
Run Code Online (Sandbox Code Playgroud)
我不想以B列为条件来更改A列的值,而是将多个列(B列和C列)中的值乘以A列中的值,并替换初始列中的值,以便获得以下内容:
Table 1:
Column A | Column B | Column C
------------------------------
1 | 4 | 7
2 | 10 | 16
3 | 18 | 27
Run Code Online (Sandbox Code Playgroud)
这可以不用多个Table.AddColumn后跟序列来完成Table.RemoveColumns吗?
我也Table.TransformColumns基于此进行了尝试,但是无法正确获取语法来实现此目的。
Table.TransformColumnsColumn 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
Run Code Online (Sandbox Code Playgroud)
这对于B和C列效果很好,但是如果您需要B 到 Z,则可能希望使用更合理的逻辑来避免重复。
编辑:对于许多列,更通用的解决方案是对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
Run Code Online (Sandbox Code Playgroud)