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 на основе этого, но не смог получить правильный синтаксис для достижения этого.

1813   3  

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

    Ничего не найдено.