在Power Query中利用表达式查找创建动态列
Power Query 基于转换表动态扩展布尔列
核心思路
用List.Accumulate迭代转换表的每一行,逐行为Source表添加新列,配合Expression.Evaluate解析转换表中的文本表达式,实现动态扩展。
具体实现步骤
假设你的数据结构如下:
- Source表:包含若干布尔类型列(如
列1、列2) - 转换表:包含两列,
新列名(指定要添加的列名称)、表达式(基于Source列的布尔运算文本,如[列1] and [列2])
直接套用以下M代码,替换你的原始表和你的转换表为实际数据源:
let // 替换为你的原始布尔列数据源 Source = 你的原始表, // 替换为你的转换规则表 TransformTable = 你的转换表, // 将转换表转为记录列表,方便迭代 TransformList = Table.ToRecords(TransformTable), // 迭代添加列 Result = List.Accumulate( TransformList, Source, (当前表, 转换规则) => Table.AddColumn( 当前表, 转换规则[新列名], // 解析表达式并在当前行上下文执行 each Expression.Evaluate(转换规则[表达式], [_ = _]), // 指定新列为布尔类型,与原始列保持一致 type logical ) ) in Result
关键细节说明
- List.Accumulate:作为迭代器,从Source表开始,每一步根据转换规则添加一列,最终生成包含所有新列的表
- Expression.Evaluate:把转换表中的文本表达式(如
[列1] or [列2])转换成可执行的M代码,[_ = _]确保表达式能识别当前行的列引用 - 类型指定:
type logical强制新列为布尔类型,避免自动识别出错
注意事项
- 转换表的表达式必须是合法的M语言布尔运算:用
and/or/not,不要用Excel函数AND/OR - 列名带空格时,表达式里要写成
[带空格的列名]格式 - 若转换表存在重复的
新列名,后续规则会覆盖之前的列,建议提前去重
内容的提问来源于stack exchange,提问作者Blue Wolverine
相关产品推荐
相关产品推荐

