Выполните операцию над несколькими таблицами в списке - PullRequest
1 голос
/ 14 февраля 2020

Пытаясь научить себя Power Query и не могу разобраться в этом конкретном процессе.

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

  • Мои исходные данные содержат пары информации [Credit, Name] в соседних столбцах с неизвестным количеством пар.

    • Поскольку это таблица, разные столбцы / пары имеют разные имена.

      Credit|Name|Credit1|Name1|...

  • Если я опущу заголовки и перенесу таблицу, заголовки столбцов окажутся в столбце 1, и я смогу снять дифференцирующую ди git.

  • Используя Table.Split, я могу затем создать несколько таблиц, в которых каждая пара столбцов имеет одинаковые заголовки.
  • Затем я могу объединить эти таблицы, чтобы создать одну, две таблица столбцов, где я могу группировать и агрегировать, чтобы получить результаты.

Моя проблема в том, что я не смог выяснить, как выполнить операцию:

Table.PromoteHeaders(Table.Transpose(table))

в каждой таблице.

Этот М-код дает желаемый результат для четырех пар столбцов в предоставленных данных, но явно не масштабируется, поскольку количество таблиц необходимо знать заранее.

let 
   //Create the table
   Tbl1= Table.FromRecords({
      [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
      [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"]
      }),

   //Demote headers and transpose
   transpose1 = Table.Transpose( Table.DemoteHeaders(Tbl1)),

   //Create matching names for what will eventually be the final Column Headers
    #"Split Column by Character Transition" = Table.SplitColumn(transpose1, "Column1", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"Column1.1", "Column1.2"}),
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Character Transition",{"Column1.2"}),

   //Create multiple tables from above
    multTables = Table.Split(#"Removed Columns",2),

   /*transpose and promote the headers for each table
   HOW can I do this in a single step when I don't know how many tables there might be???
   */

   tbl0 = Table.PromoteHeaders(Table.Transpose(multTables{0}),[PromoteAllScalars=true]),
   tbl1 = Table.PromoteHeaders(Table.Transpose(multTables{1}),[PromoteAllScalars=true]),
   tbl2  = Table.PromoteHeaders(Table.Transpose(multTables{2}),[PromoteAllScalars=true]),
   tbl3 = Table.PromoteHeaders(Table.Transpose(multTables{3}),[PromoteAllScalars=true]),

   combTable = Table.Combine({tbl0,tbl1,tbl2,tbl3})


in
    combTable

Исходный стол

enter image description here

Пониженные заголовки / транспонированный стол

enter image description here

Желаемый результат

enter image description here

Любая помощь будет принята с благодарностью .

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вы также можете попробовать заменить эту часть своего кода:

   tbl0 = Table.PromoteHeaders(Table.Transpose(multTables{0}),[PromoteAllScalars=true]),
   tbl1 = Table.PromoteHeaders(Table.Transpose(multTables{1}),[PromoteAllScalars=true]),
   tbl2  = Table.PromoteHeaders(Table.Transpose(multTables{2}),[PromoteAllScalars=true]),
   tbl3 = Table.PromoteHeaders(Table.Transpose(multTables{3}),[PromoteAllScalars=true]),

   combTable = Table.Combine({tbl0,tbl1,tbl2,tbl3})


in
   combTable

на эту:

    Custom1 = List.Transform(multTables, each Table.PromoteHeaders( Table.Transpose(_),[PromoteAllScalars=true])),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandTableColumn(#"Converted to Table", "Column1", {"Credit", "Name"}, {"Credit", "Name"})
in
    #"Expanded Column1"
1 голос
/ 14 февраля 2020

Немного неуклюже, но, похоже, работает с любым количеством строк и любым количеством парных столбцов с двумя столбцами.

Сначала несколько индексов, измененных по-разному, затем фильтр в две таблицы, unpivot и merge

let  Tbl1= Table.FromRecords({
  [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
  [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"],
  [Credit = 3, Name = "Sam", Credit2 = 5, Name2="Allen", Credit3 = 3.5, Name3 = "Ralph",Credit4 = 7, Name4="Nance"]
  }),

#"Transposed Table" = Table.Transpose(Tbl1),
#"Added Index" = Table.AddIndexColumn(#"Transposed Table", "Index", 0, .5),
#"Added Custom" = Table.AddColumn(#"Added Index", "Index2", each Number.RoundDown([Index])),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index"}),
#"Added Index1" = Table.AddIndexColumn(#"Removed Columns", "Index", 0, 1),
#"Added Custom1" = Table.AddColumn(#"Added Index1", "Custom", each Number.Mod([Index],2)),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom1",{"Index"}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Columns1", {"Index2", "Custom"}, "Attribute", "Value"),
#"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([Custom] = 0)),
#"Filtered Rows2" = Table.SelectRows(#"Unpivoted Other Columns", each ([Custom] = 1)),
#"Merged Queries" = Table.NestedJoin(#"Filtered Rows2",{"Index2", "Attribute"},#"Filtered Rows",{"Index2", "Attribute"},"Filtered Rows",JoinKind.LeftOuter),
#"Expanded Filtered Rows" = Table.ExpandTableColumn(#"Merged Queries", "Filtered Rows", {"Value"}, {"Value.1"}),
#"Removed Columns2" = Table.RemoveColumns(#"Expanded Filtered Rows",{"Index2", "Custom", "Attribute"})
in #"Removed Columns2"

Еще один способ сделать это - создать две таблицы, выбрав и отключив группы столбцов, основанные на именах столбцов, а затем объединяющие их с помощью пользовательского столбца, ссылающегося на индекс строки в каждой таблице

  let  Tbl1= Table.FromRecords({
  [Credit = 1, Name = "Bob", Credit2 = 2, Name2 = "Jim", Credit3 = 1, Name3 = "George", Credit4 = 1.75, Name4="Phil"],
  [Credit = 2, Name = "Phil", Credit2 = 4, Name2="George", Credit3 = 2.5, Name3 = "Stephen",Credit4 = 6, Name4="Bob"],
  [Credit = 3, Name = "Sam", Credit2 = 5, Name2="Allen", Credit3 = 3.5, Name3 = "Ralph",Credit4 = 7, Name4="Nance"]
  }),
  Credit = List.Select(Table.ColumnNames(Tbl1), each Text.Contains(_, "Credit")),
  Name = List.Select(Table.ColumnNames(Tbl1), each Text.Contains(_, "Name")),

  // create table of just Names with index
  #"Removed Columns1" = Table.RemoveColumns(Tbl1,Credit),
  #"Added Index" = Table.AddIndexColumn(#"Removed Columns1", "Index", 0, 1),
  #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),

  // create table of just Credits with index
  #"Removed Columns2" = Table.RemoveColumns(Tbl1,Name),
  #"Added Index2" = Table.AddIndexColumn(#"Removed Columns2", "Index", 0, 1),
  #"Unpivoted Other Columns2" = Table.UnpivotOtherColumns(#"Added Index2", {"Index"}, "Attribute", "Value"),
  #"Added Index1" = Table.AddIndexColumn(#"Unpivoted Other Columns2", "Index.1", 0, 1),

  //merge two table together and remove excess columns
  #"Added Custom" = Table.AddColumn(#"Added Index1", "Custom", each #"Unpivoted Other Columns"{[Index.1]}[Value]),
  #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Attribute", "Index.1"})
  in #"Removed Columns"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...