Group/Buckets 内的 Power Query 转换数据

Power Query Transform data within Group/Buckets

我想转换 Power 查询中的列。仅应根据条件在组内应用转换。这是我的数据。

在上面的 table 中,如果特定 ID 组上任何基于 Office 的列设置为 1,我只想将基于 Office 的列转换为全 1。但所有基于 Office 的列值在特定 ID 组上均为 0,因此不应转换该列。

我的预期结果是,

如果一个额外的列可以有转换后的列就好了。

试试这个

let  Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", type text}, {"Item", type text}, {"Home Based", Int64.Type}, {"Office Based", Int64.Type}, {"Amount", Int64.Type}}),

// find all IDs with 1 in Office Based
#"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Office Based] = 1)),
#"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"ID"}),
#"Removed Duplicates" = Table.Distinct(#"Removed Other Columns"),

//merge that back in
#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"ID"}, #"Removed Duplicates", {"ID"}, "Table2", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"ID"}, {"ID.1"}),

// if there was a match convert to 1 otherwise take original number
#"Added Custom" = Table.AddColumn(#"Expanded Table2", "OfficeBased2", each try if Text.Length([ID.1])>0 then 1 else [Office Based] otherwise [Office Based]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Office Based", "ID.1"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"OfficeBased2", "OfficeBased"}})
in #"Renamed Columns"

或更紧凑的版本:

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source,"Custom",(i)=>Table.SelectRows(Source, each [ID]=i[ID]) [Office Based]),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Office Based2", each if List.Contains([Custom],1) then 1 else [Office Based]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Custom", "Office Based"})
in  #"Removed Columns"

第一种方法可能最适合大型数据集

这是另一种方法:

  • 按 ID 分组
  • 对每个子表应用Table.TransformColumns操作
  • 然后re-expand
let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", type text}, {"Item", type text}, {"Home Based", Int64.Type}, {"Office Based", Int64.Type}, {"Amount", Int64.Type}}),

    #"Grouped Rows" = Table.Group(#"Changed Type", {"ID"}, {        
        {"Xform", (t)=>Table.TransformColumns(t, {
            {"Office Based", each if List.ContainsAny(t[Office Based],{1}) then 1 else 0}}) ,       
        type table 
            [ID=nullable text, Item=nullable text, Home Based=nullable number, Office Based=nullable number, Amount=nullable number]}
            }),
    #"Expanded Xform" = Table.ExpandTableColumn(#"Grouped Rows", "Xform", 
        {"Item", "Home Based", "Office Based", "Amount"}, 
        {"Item", "Home Based", "Office Based", "Amount"})
in
    #"Expanded Xform"