使用M Code(Power Query)快速删除空列

4

我在Power Query中使用以下代码来移除一个包含很多列的表格中的空列。但是这个方法运行速度非常慢,我正在寻找一种加快速度的方法。基本上,如果一个给定列中的所有条目都为空,则应该将该列删除。

//Remove Empty Columns
ColumnstoKeep = List.Select(
        Table.ColumnNames(#"Expanded"),each List.NonNullCount(Table.Column(#"Expanded",_)) <>0 ),

RemoveEmptyColumns = Table.SelectColumns(#"Expanded",ColumnstoKeep),

我怀疑没有任何方法可以加速这个过程。代码只是做最少的工作来满足您的要求,即检查完整列的值是否为空。您可以尝试在空值检查之前缓冲表格。那将是我的下一个选择。 - David Bacci
我正在学习 M 语言,所以我想知道是否可以通过转换为不同的数据类型或使用不同的函数来提高速度。你能否提供代码片段,以便我尝试缓冲?谢谢。 - Rafadan
此外,如果在给定列中遇到非空值,则可能中止搜索以节省时间。但我不确定实现起来有多容易。 - Rafadan
对于我的特定数据集,以下算法将非常高效:
  1. 从左到右扫描列
  2. 如果项目非空,则将列名添加到列表中,转到下一列
  3. 如果列中的所有行都为空,则停止搜索
  4. 仅选择列表中的列。
- Rafadan
我会以缓冲区作为示例。你的第二个选项可能可行,但我怀疑 M 已经在内部进行了优化。 - David Bacci
显示剩余8条评论
3个回答

4
//Remove Empty Columns
bufferedTable = Table.Buffer( #"Expanded"),
ColumnstoKeep = List.Select(
        Table.ColumnNames(#"bufferedTable"),each List.NonNullCount(Table.Column(#"bufferedTable",_)) <>0 ),

RemoveEmptyColumns = Table.SelectColumns(#"bufferedTable",ColumnstoKeep),

1
两种方法。哇!! - Mayukh Bhattacharya

3

这是另一个答案,一旦到达第一个非空列,就会停止。

enter image description here

enter image description here

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTIyAhIoKFYHKoNNAipujE0CUzwWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t, Column3 = _t, Column4 = _t, Column5 = _t, Column6 = _t, Column7 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", Int64.Type}, {"Column2", Int64.Type}, {"Column3", Int64.Type}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}),
    sampleTable = Table.ReplaceValue(#"Changed Type","",null,Replacer.ReplaceValue,{"Column4", "Column5", "Column6", "Column7"}),
    columnNames = Table.ColumnNames( sampleTable),
    Custom1 = List.Generate(
        ()=> [name = columnNames{index}, index = 0] ,
        each  [index] < List.Count(columnNames) and List.NonNullCount(Table.Column(sampleTable,[name])) <>0,
        each [name = columnNames{index}, index = [index]+ 1] ,
        each [name]
        )
in
    Custom1

0
这些已经是一些很好的建议了。我之前使用过的一个方法是:
let
  tbl = Source, 
  Headers = Table.ColumnNames( tbl ), 
  Result = 
    Table.SelectColumns(
      tbl, 
      List.Select( 
          Headers, 
          each List.MatchesAny( Table.Column( tbl, _ ), each _ <> null ) )
    )
in
  Result

我还没有测试过性能,但值得一试。它使用 List.MatchesAny 来查找至少有一个非空值的任何列(参见https://powerquery.how/list-matchesany/

祝好, Rick


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接