PowerQuery中如何指定fill down填充行数实现限定步长向下填充
PowerQuery 限定步长向下填充+向上填充实现方法
实现逻辑
默认的「向下填充」功能会将非空值填充至下一个非空值出现的位置,无法直接限制填充行数。我们可以通过索引列标记每个客户值的起始位置,先完成限定6行范围的定向向下填充,再对剩余空值执行向上填充,即可达到每8行归为一个客户分组的效果。
分步操作指引
- 步骤1:导入原始数据表后,添加从0开始的索引列
操作路径:「添加列」选项卡 > 「索引列」> 选择「从0开始」,新增列默认名称为Index - 步骤2:标记所有Client非空值的行位置
新增自定义列,列名设为ClientStartRow,输入公式:= if [Client] <> null then [Index] else null - 步骤3:对
ClientStartRow列执行默认向下填充
选中ClientStartRow列,点击「转换」选项卡 > 「填充」> 「向下」,此时每一行都会匹配到上方距离最近的Client非空值所在的索引行号 - 步骤4:对原始Client列执行默认向下填充,得到临时填充列
选中原始Client列,同样执行「填充」>「向下」,将该列重命名为TempFilledClient - 步骤5:生成限定6行范围的第一次填充结果
新增自定义列,列名设为Client_FirstStep,输入公式:
该公式判断当前行与最近的上方Client起始行的偏移量,偏移量不超过6(即起始行+下方连续6行)时保留填充值,其余位置置空= if [Index] - [ClientStartRow] <= 6 then [TempFilledClient] else null - 步骤6:清理临时列
删除原始Client、ClientStartRow、TempFilledClient三列,将Client_FirstStep重命名为Client - 步骤7:执行向上填充补全剩余空值
选中新的Client列,点击「转换」选项卡 > 「填充」>「向上」,剩余空值会自动匹配下方距离最近的Client值,最终完成每8行对应一个客户的分组效果。
可直接复用的M代码示例
如果需要直接在高级编辑器中修改代码,可参考以下核心逻辑(替换你自己的源步骤即可):
let 源 = 你的原始数据表步骤, 已添加索引 = Table.AddIndexColumn(源, "Index", 0, 1, Int64.Type), 已添加起始行标记 = Table.AddColumn(已添加索引, "ClientStartRow", each if [Client] <> null then [Index] else null), 向下填充起始行 = Table.FillDown(已添加起始行标记,{"ClientStartRow"}), 临时向下填充Client = Table.FillDown(向下填充起始行,{"Client"}), 重命名临时列 = Table.RenameColumns(临时向下填充Client,{{"Client", "TempFilledClient"}}), 第一次限定步长填充 = Table.AddColumn(重命名临时列, "Client", each if [Index] - [ClientStartRow] <=6 then [TempFilledClient] else null), 删除临时列 = Table.RemoveColumns(第一次限定步长填充,{"ClientStartRow", "TempFilledClient", "Index"}), 向上填充补全 = Table.FillUp(删除临时列,{"Client"}) in 向上填充补全
注意:如果需要调整向下填充的行数,只需要修改公式里的
<=6数值即可,不需要改动其他逻辑。
内容的提问来源于stack exchange,提问作者Rafael N. De Pietro
相关产品推荐
相关产品推荐

