Power Query Excel中如何定位每行首个非空值所在列?
Power Query 获取首个非空值对应的列名解决方案
下面提供两种无需嵌套if的高效方法,直接获取每行首个非空值所在的列名:
方法一:利用记录操作(简洁直观)
通过将行转换为记录,筛选非空字段后提取字段名:
Table.AddColumn(#"Previous", "NotNull_ColumnName", each let // 仅保留目标列的当前行记录 currentRecord = Record.SelectFields(_, {"ColA", "ColB", "ColC"}), // 移除所有值为空的字段,保留非空字段记录 nonNullRecords = Record.RemoveFields( currentRecord, List.RemoveNulls(Record.FieldValues(currentRecord), true) ), // 提取首个非空字段的列名,空值时返回null避免报错 firstNonNullColName = try Record.FieldNames(nonNullRecords){0} otherwise null in firstNonNullColName )
代码说明:
Record.SelectFields:限定只处理目标列,排除无关列干扰List.RemoveNulls(..., true):获取所有值为空的字段名,配合Record.RemoveFields得到仅含非空值的记录try ... otherwise null:处理所有列均为空的边界情况,避免查询报错
方法二:列名与值配对筛选(灵活可控)
通过List.Zip将列名和对应值配对,筛选后提取列名:
Table.AddColumn(#"Previous", "NotNull_ColumnName", each let // 定义需要检查的目标列名列表 targetCols = {"ColA", "ColB", "ColC"}, // 将列名与当前行对应的值一一配对 pairedList = List.Zip({ targetCols, List.Transform(targetCols, (col) => Record.Field(_, col)) }), // 筛选出值不为空的配对项 nonNullPairs = List.Select(pairedList, each _{1} <> null), // 提取首个非空配对的列名,空值时返回null firstNonNullColName = try nonNullPairs{0}{0} otherwise null in firstNonNullColName )
代码说明:
List.Zip:将列名列表和对应值列表打包成{{列名1, 值1}, {列名2, 值2}}的结构List.Select:精准过滤掉值为空的配对项- 若需动态获取目标列(比如前N列),可将
targetCols替换为List.Range(Table.ColumnNames(#"Previous"), 0, 3)(示例为前3列)
内容的提问来源于stack exchange,提问作者Javi S
相关产品推荐
相关产品推荐

