Power Query: преобразование столбца путем умножения на другой столбец
Я хочу сделать что-то похожее на Power Query преобразование столбца на основе другого столбца, но я застрял на том, как изменить синтаксис для моей конкретной цели.
Аналогично связанному вопросу, предположим, что у меня есть следующая таблица:
Table 1:
Column A | Column B | Column C
------------------------------
1 | 4 | 7
2 | 5 | 8
3 | 6 | 9
Вместо изменения значения столбца a, обусловленного столбцом B, Я хочу умножить значения в нескольких столбцах (столбец 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 на основе этого, но не смог получить правильный синтаксис для достижения этого.
3 ответов:
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, но если вам нужно B через Z, вам может понадобиться более причудливая логика, чтобы избежать повторения.
EDIT: более общим решением для многих столбцов является использование
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
Я думаю, что таблица.AddColumn, за которым следует таблица.RemoveColumns-самый обычный и понятный способ для этой трансформации. Я также не доволен тем, что это приводит к такому количеству шагов в PowerQuery. Но из-за внутренних методов backfolding PowerQuery это обычно не приводит к лучшей производительности. (PowerQuery пытается вернуть основную работу в запрашиваемую базу данных, если она доступна)
Предполагая, что это не обязательно VBA и / или programmatic, вы можете просто скопировать значения в первом столбце, затем выделить значения во втором столбце и "вставить специальный..." > Помножить.
, что приведет к получению результатов в том же месте, куда вы вставляете множитель.
Comments