2015-07-21 4 views
3

Я постоянно думаю, что это должно быть легко, но ответ уклоняется от меня. В Excel Power Query я хотел бы преобразовать значение в каждой строке столбца на основе значения другого столбца. Например, предположим, что у меня есть Table1 следующим образом:Power Query Преобразование столбца на основе другого столбца

Column A | Column B 
------------------- 
X  | 1 
Y  | 2 

Я хотел бы преобразовать значения в столбце А на основе значений в колонке B, без необходимости добавить новый столбец и заменить оригинальный Колонка A. Я попытались использовать TransformColumns, но вход может быть только значением целевого столбца - я не могу получить доступ к другим значениям поля в строке/записи из функции TransformColumns. Я бы как, чтобы быть в состоянии сделать что-то вроде этого:

=Table.TransformColumns(Table1, {"Column A", each if [Column B]=1 then "Z" else _ }) 

, который приведет к:

Column A | Column B 
------------------- 
Z  | 1 
Y  | 2 

Я знаю, что есть способы сделать это, но я пытаюсь найти один с наименьшим количеством шагов/преобразований. Например, я знаю, что я мог бы использовать Table.AddColumn для добавления нового Столбец A на основе функции, которая смотрит на столбец B, но затем мне нужно удалить исходный столбец A и заменить его новым столбцом A, который требует нескольких дополнительные шаги.

ответ

8

Вот как я в конечном итоге делает это:

Table1: 
Column A | Column B 
------------------- 
X  | 1 
Y  | 2 

= Table.FromRecords(Table.TransformRows(Table1, 
    (r) => Record.TransformFields(r, 
     {"A", each if r[Column B]="1" then "Z" else _}))) 

Результат:

Column A | Column B 
------------------- 
Z  | 1 
Y  | 2 

Таким образом, вы можете преобразовать несколько столбцов одновременно с помощью вложенного списка в функции Record.TransformFields.

0

Вы не можете преобразовать существующий столбец таким шагом. Используйте новый столбец, выполните преобразование, а затем удалите существующий столбец. Подумаешь? В Excel вы не ожидаете, что формула изменит значение другого столбца. В Power Query результат формулы также сохраняется в столбце, и это не может быть столбец, который предоставляет одно из значений ввода формулы.

+1

Сделка в первую очередь заключается в том, что я должен сделать это с помощью нескольких разных таблиц, и это было похоже на шаг, который можно было бы сделать в 1 шаге против несколько (т. е. Создать новый столбец, удалить старый столбец, переименовать новый столбец). Кроме того, я должен сделать это с несколькими столбцами на таблицу, и что хорошо для TransformColumns, это можно применить к нескольким столбцам одновременно, тогда как AddColumn добавляет по одному. У меня есть потенциальное решение, в котором я конвертирую таблицу в список записей и использую Record.TransformFields, которые я могу предоставить позже. – LoganTheSnowEater

+0

Тем не менее вам понадобится новый столбец для результата преобразования. – teylyn

0

Другой вариант заключается в следующем:

= Table.ReplaceValue (Таблица1, каждый [Колонка A], каждый, если [Колонка B] = 1, то "Z" еще [Колонка A], Replacer.ReplaceText, {» Столбец A "})

Код немного читабельнее, но может применяться только к одному столбцу за раз.

Большинство из них могут быть получены с помощью пользовательского интерфейса, как показано здесь: http://www.thebiccountant.com/2017/07/23/transforming-a-column-with-values-from-another-column-in-powerbi-and-powerquery-in-excel/

1

Престижность LoganTheSnowEater ... Я люблю свой ответ. Вы сказали, что она может быть расширена на нескольких действий, и я хотел вывесить пример того, как я успешно использовал его, чтобы сделать это:

#"Patch Records" = Table.FromRecords(Table.TransformRows(#"Sorted Rows", 
(r) => Record.TransformFields(r, { 
    {"Min Commit", each 
     if r[service_id] = "21430" then 81 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 46.9 else 
     _}, 
    {"Installed", each 
     if r[service_id] = "21430" then 90 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 52 else 
     _}, 
    {"Requested", each 
     if r[service_id] = "21430" then 90 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 52 else 
     _}}))) 

Мой единственный сюрприз, что мне пришлось сбросить все типы данных, после того, как Я сделал, но это имеет смысл в ретроспективе.

p.s.У меня не было достаточно очков репутации, чтобы опубликовать это в качестве комментария к решению

Смежные вопросы