Страницы: 1
RSS
PQ в столбце заменить любое значение по условию в другом столбце
 
добрый день. Не могли бы показать как в Power Query в столбце заменить любое значение по условию в другом столбце. Условие такое: если в Столбце1 null, то в Столбце2 заменить значение на null.
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}, {"Столбец2", Int64.Type}}),
    #"Замененное значение" = Table.ReplaceValue(#"Changed Type", each if [Столбец1] = null then [Столбец2] else null, null, Replacer.ReplaceValue,{"Столбец2"})
in
    #"Замененное значение"

Так как сам почти не пишу в расширенном редакторе, то совет: делаем кнопками условный столбец и замену значений. Прикручиваем код из условного столбца к замене значений и сохраняем результат

Изменено: Dark1589 - 06.05.2019 16:54:58
 
А у меня вот так кнопками вышло

Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}, {"Столбец2", Int64.Type}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Changed Type", "Пользовательская", each if [Столбец1] = null then null else [Столбец2]),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Добавлен пользовательский объект",{"Столбец2"})
in
    #"Удаленные столбцы"
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dark1589, Dyroff, спасибо
Цитата
Dark1589 написал:
условный столбец и замену значений
именно так я мог сделать, только так растягивается на шага три (столб-дубликат, удаление столбца и переименование столбца)
думал что только через функцию(=>) можно  сделать. как оказалось, нет
 
Цитата
artyrH написал:
именно так я мог сделать, только так растягивается на шага три
Пазл сложился ,а то я смотрю, какой-то странный вопрос от Вас:)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
artyrH написал:
думал что только через функцию(=>) можно  сделать
Вы хочите функций? Их есть у меня!  :D
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}, {"Столбец2", Int64.Type}}),
    #"Замененное значение" = Table.ReplaceValue(#"Changed Type", (x) => if x[Столбец1] = null then x[Столбец2] else null, null, Replacer.ReplaceValue,{"Столбец2"})
in
    #"Замененное значение"

В принципе вам Dark1589 через нее и сделал, только не объявлял её, а объявил все через each.
Вот горшок пустой, он предмет простой...
 
Цитата
Dyroff написал:
какой-то странный вопрос
Цитата
PooHkrd написал:
хочите функций?
так я сначала отсюда пытался что то прикрутить в одном шаге. но уже нашлось решение проще
PooHkrd,  спасибо  
 
Ещё вариант (по мотивам решения Alexey_Spb):
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Столбец1", type text}, {"Столбец2", Int64.Type}}),
    #"Замененное значение" = Table.ReplaceValue(#"Changed Type", each [Столбец1], null, (a,b,c) => if b=c then c else a,{"Столбец2"})
in
    #"Замененное значение"
Изменено: Aleksei_Zhigulin - 06.05.2019 18:08:29
 
Aleksei_Zhigulin, спасибо
по скорости выполнения варианты из #2, #6, #8 примерно одинаковы
 
artyrH, так не честно!  :D Тогда уж и вариант из #3 надо сравнивать. По идее он самый быстрый должен быть.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
По идее он самый быстрый
так и есть. вариант из #3 - самый быстрый
решил умолчать об этом :oops:  ;)  а то лишу себя в предстоящих темах решений через функции с (=>). мол, зачем давать решения через функции если они медленно выполняются
Изменено: artyrH - 07.05.2019 10:04:31
 
artyrH, тут вопрос не в функциях, а в специфике транслятора команд PQ.
Если грубо то одно и то же вычисление реализованное через
Код
= Table.RenameColumn( Table.RemoveColumn( Table.AddColumn () ) )

будет всегда быстрее чем через Table.TransformColumn или Table.ReplaceValue. Я конечно не Максим и не Андрей, и не на столько крут в теории как они, но для себя определяю это так: вариант с новым столбцом рассчитывается траслятором за один проход при помощи пресловутых ленивых вычислений и promises.
Скрытый текст

А вариант с заменой заставляет транслятор отступать от ленивых вычислений, и он начинает перебирать каждый элемент столбца сделав то количество проходов, сколько строк в таблице.
Как это по другому объяснить даже не знаю.  :D
Изменено: PooHkrd - 07.05.2019 10:48:17
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх