.png)
Я искал везде и много пробовал, похоже, большинству людей не нужно решение этой проблемы :-( У меня есть таблица с двумя столбцами. Столбец A (TAG) имеет 4 различных значения, повторяющихся в этом шаблоне снова и снова. Они станут моими различными именами столбцов. Столбец B (VALUE) содержит совпадающие значения для этих тегов.
Теперь я просто хотел бы создать таблицу, которая будет выглядеть следующим образом: (Каждое отдельное значение из строки TAG становится заголовком столбца, а все значения из столбца VALUE становятся отдельными значениями под этими новыми столбцами)
Я бы предпочел выполнить все эти транспонирования в PowerQuery сразу после импорта CSV-файла, из которого получены данные, но было бы неплохо сделать это и позже в какой-нибудь операции с диапазоном/таблицей.
Любая помощь могла бы быть полезна :-)
решение1
В Power Query вы бы свели столбец TAG, используя столбец VALUE в качестве значений и no aggregation
.
Однако если вы сделаете это с вашим набором данных, вы получите ошибочные значения, поскольку у вас есть несколько записей для одного и того же значения Pivot.
Этого можно избежать, добавив столбец индекса, который последовательно нумерует каждую из отдельных записей тега.
Чтобы сделать это, а также учесть, что ТЭГИ не всегда располагаются в одном и том же порядке, вы можете
- Группировать по тегу
- добавить столбец индекса в каждую подтаблицу
- Развернуть таблицы
- Сводка по TAG без агрегации
- Удалить столбец «Индекс»
В приведенном ниже коде изучите комментарии и применяемые шаги, чтобы лучше понять.
Если этот метод слишком медленный для вашего набора данных, опубликована пользовательская функция, которая может выполняться быстрее.
let
//replace next lines to reflect your actual data source
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"TAG", type text}, {"VALUE", type text}}),
//Group By Tage
#"Grouped Rows" = Table.Group(#"Changed Type", {"TAG"}, {
//add an Index column to each subtable
{"with Index", each Table.AddIndexColumn(_,"Index",0,1), type table [TAG=nullable text, VALUE=nullable text, Index=Int64.Type]}}),
//Expand the sub tables
#"Expanded with Index" = Table.ExpandTableColumn(#"Grouped Rows", "with Index", {"VALUE", "Index"}),
//Pivot with no aggregation
#"Pivoted Column" = Table.Pivot(#"Expanded with Index", List.Distinct(#"Expanded with Index"[TAG]), "TAG", "VALUE"),
//Remove the Index column
#"Removed Columns" = Table.RemoveColumns(#"Pivoted Column",{"Index"})
in
#"Removed Columns"
Отредактировано для отображения пользовательской функции для выполнения неагрегационного сводного анализа.
Пользовательская функция
вставьте в пустой запрос и переименуйте как в комментариях к коду
//credit: Cam Wallace https://www.dingbatdata.com/2018/03/08/non-aggregate-pivot-with-multiple-rows-in-powerquery/
//Rename: fnPivotAll
(Source as table,
ColToPivot as text,
ColForValues as text)=>
let
PivotColNames = List.Buffer(List.Distinct(Table.Column(Source,ColToPivot))),
#"Pivoted Column" = Table.Pivot(Source, PivotColNames, ColToPivot, ColForValues, each _),
TableFromRecordOfLists = (rec as record, fieldnames as list) =>
let
PartialRecord = Record.SelectFields(rec,fieldnames),
RecordToList = Record.ToList(PartialRecord),
Table = Table.FromColumns(RecordToList,fieldnames)
in
Table,
#"Added Custom" = Table.AddColumn(#"Pivoted Column", "Values", each TableFromRecordOfLists(_,PivotColNames)),
#"Removed Other Columns" = Table.RemoveColumns(#"Added Custom",PivotColNames),
#"Expanded Values" = Table.ExpandTableColumn(#"Removed Other Columns", "Values", PivotColNames)
in
#"Expanded Values"
Основной код
let
//replace next lines to reflect your actual data source
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"TAG", type text}, {"VALUE", type text}}),
//call custom pivot function
pivot = fnPivotAll(#"Changed Type","TAG","VALUE")
in
pivot