Частично транспонировать таблицу - PullRequest
1 голос
/ 07 мая 2020

У меня есть CSV-файл с информацией о некоторых производственных партиях. При загрузке в редактор Excels PowerQuery таблица выглядит так:

Batch    Date         RawMaterial1    RawMaterial2    RawMaterial3    Amount1    Amount2    Amount3
123      01.01.2020   Fe              Cr              Ni              70         19         11
234      01.02.2020   Fe              Cr              Ni              72         17          9

Чтобы сделать эту таблицу более читаемой, я ищу способ частично транспонировать ее, чтобы преобразовать в такой формат:

Batch    Date         RawMaterials    Amounts
123      01.01.2020   Fe              70
                      Cr              19
                      Ni              11
234      01.02.2020   Fe              72
                      Cr              17
                      Ni              11

Есть ли способ реализовать это с помощью только PowerQueryM?

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Это можно сделать немного проще:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],,
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Batch", Int64.Type}, {"Date", type date}, {"RawMaterial1", type text}, {"RawMaterial2", type text}, {"RawMaterial3", type text}, {"Amount1", Int64.Type}, {"Amount2", Int64.Type}, {"Amount3", Int64.Type}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Batch", "Date"}, "Attribute", "Value"),
    #"Split Column by Character Transition" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"Type", "Index"}),
    #"Pivoted Column" = Table.Pivot(#"Split Column by Character Transition", List.Distinct(#"Split Column by Character Transition"[Type]), "Type", "Value")
in
    #"Pivoted Column"
  1. Отменить разворот всех столбцов, кроме первых двух.
  2. Разделить столбец атрибутов на текстовую часть и часть индекса (в GUI: Transform> Split Column> By Non-Di git to Di git).
  3. Вернитесь к столбцу текстовой части (выберите «Не агрегировать» в сводном столбце Advanced варианты).
2 голосов
/ 07 мая 2020

Кажется, это работает

Отменяет все столбцы, кроме первых двух

Дублировать столбец данных

Измените тип столбца на номер, чтобы вызвать ошибку в нечисловых столбцах

Измените все ошибки на что-то узнаваемое, например, 999999999999

Фильтруйте на основе этого в две таблицы и добавьте индекс в каждую таблицу

Объедините две таблицы вместе

Добавить новый столбец, используя индекс, чтобы увидеть, совпадает ли пакет с предыдущей строкой, чтобы исключить дубликаты

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Date", "Batch"}, "Attribute", "Value"),
#"Duplicated Column" = Table.DuplicateColumn(#"Unpivoted Other Columns", "Value", "Value - Copy"),
#"Changed Type" = Table.TransformColumnTypes(#"Duplicated Column",{{"Value - Copy", type number}}),
#"Replaced Errors" = Table.ReplaceErrorValues(#"Changed Type", {{"Value - Copy", 999999999999999}}),
#"Filtered Rows" = Table.SelectRows(#"Replaced Errors", each ([#"Value - Copy"] = 999999999999999)),
#"Filtered Rows2" = Table.SelectRows(#"Replaced Errors", each ([#"Value - Copy"] <> 999999999999999)),
Index1 = Table.AddIndexColumn(#"Filtered Rows", "Index", 0, 1),
Index2 = Table.AddIndexColumn(#"Filtered Rows2", "Index", 0, 1),
#"Merged Queries" = Table.NestedJoin(Index2,{"Index"},Index1,{"Index"},"Index3",JoinKind.LeftOuter),
#"Expanded Index3" = Table.ExpandTableColumn(#"Merged Queries", "Index3", {"Value"}, {"Value.1"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Index3",{"Attribute", "Value - Copy"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "Batch.1", each if [Index] = 0 then [Batch] else if #"Removed Columns"{[Index]-1}[Batch] = [Batch] then null else [Batch]),
#"Added Custom2" = Table.AddColumn(#"Added Custom", "Date.1", each if [Index] = 0 then [Date] else if #"Removed Columns"{[Index]-1}[Batch] = [Batch] then null else [Date]),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom2",{"Batch", "Date", "Index"}),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns1",{"Batch.1", "Date.1", "Value.1", "Value"})
in  #"Reordered Columns"
1 голос
/ 07 мая 2020

Прежде всего, большое спасибо @horseyride. Я многому научился из предложенного вами кода. К сожалению, когда я попытался добавить столбец даты в область unpivot, я обнаружил небольшую ошибку в коде. Но благодаря урокам, которые я извлек из этого, я смог создать немного более общую c версию, которая в основном следует тому же алгоритму.

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}}),
    #"Unpivot Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Batch"}, "Attribut", "Wert"),
    Filter1 = Table.SelectRows(#"Unpivot Columns", each ([Attribut] <> "Amount1" and [Attribut] <> "Amount2" and [Attribut] <> "Amount3")),
    ModFilter1 = Table.AddColumn(Filter1, "Benutzerdefiniert", each if [Attribut] = "Date" then [Attribut] else [Wert], type text),
    Filter2 = Table.SelectRows(#"Unpivot Columns", each ([Attribut] <> "RawMaterial1" and [Attribut] <> "RawMaterial2" and [Attribut] <> "RawMaterial3")),
    #"IndexFilter1" = Table.AddIndexColumn(ModFilter1, "Index", 0, 1),
    #"IndexFilter2" = Table.AddIndexColumn(Filter2, "Index", 0, 1),
    #"Join Filtered Indexes" = Table.NestedJoin(IndexFilter1,{"Index"},IndexFilter2,{"Index"},"IndexFilter2",JoinKind.LeftOuter),
    #"Expand Joined Column" = Table.ExpandTableColumn(#"Join Filtered Indexes", "IndexFilter2", {"Wert"}, {"IndexFilter2.Wert"}),
    #"Remove Columns" = Table.RemoveColumns(#"Expand Joined Column",{"Index", "Attribut", "Wert"}),
    #"Rename Columns" = Table.RenameColumns(#"Remove Columns",{{"Benutzerdefiniert", "Attribut"}, {"IndexFilter2.Wert", "Wert"}})
in
    #"Rename Columns"

Я проверяю ответ Horseyrides как правильный ответ, когда он решает мой первоначальный вопрос как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...