Power Query中如何使重复项对应字段值保持一致?
Power Query中如何使重复项对应字段值保持一致?
嗨,刚接触Power Query不用慌,这个需求其实很常见,咱们一步步来搞定它~
首先得明确你的核心需求:当ID(无字母)重复时,让对应的Stock Unit、Type、Has Types列的值保持统一——不管是现在这些字段有不一致的情况需要修正,还是想提前规范避免后续出现差异,下面两种方法都能解决:
方法一:分组提取统一值再合并(最稳妥,适合处理已有不一致的情况)
这个方法的思路是先按ID把数据分组,然后从每组里提取出你认可的统一值(比如第一个非空值、出现次数最多的值),最后再合并回原表替换掉原来的字段:
- 打开你的Power Query编辑器,确保数据已经加载进来
- 选中
ID列,点击顶部菜单栏的转换 → 分组依据 - 在弹出的分组窗口里,设置:
- 分组依据:
ID(默认就是选中的列) - 新列名:比如叫
分组行 - 操作:选择所有行,这样每个ID对应的所有数据都会被打包成一个子表
- 分组依据:
- 点击确定后,你会看到每个ID对应一行,后面跟着它的子表。接下来添加自定义列,提取每个组的统一值:
- 点击添加列 → 自定义列,分别为三个字段写公式:
- 统一Stock Unit:
List.First(List.RemoveNulls([分组行][Stock Unit]))(取组内第一个非空的Stock Unit值) - 统一Type:
List.First(List.RemoveNulls([分组行][Type])) - 统一Has Types:
List.First(List.RemoveNulls([分组行][Has Types]))
如果你想取出现次数最多的值,可以把
List.First(List.RemoveNulls(...))换成List.Mode([分组行][Stock Unit]),但要注意如果有多个值出现次数相同,List.Mode会返回列表,这时候可以再加个List.First()来取第一个 - 统一Stock Unit:
- 点击添加列 → 自定义列,分别为三个字段写公式:
- 现在展开之前的
分组行列(点击列名右侧的小箭头),只勾选原来的Stock Unit、Type、Has Types列(可以给它们加个前缀比如“原”方便对比) - 最后删掉原来的字段,保留统一后的字段,或者直接用统一字段替换原字段,就得到了每个ID对应字段值一致的表
方法二:排序后填充(适合字段正确值出现在每组第一条的情况)
如果你的数据里,每个ID的第一条记录对应的Stock Unit、Type、Has Types是正确的,那可以用更简单的填充方法:
- 按
ID列排序(点击ID列标题旁的排序按钮) - 选中
Stock Unit、Type、Has Types这三列 - 点击转换 → 填充 → 向下填充,这样每个ID组里的后续行都会自动填充成和第一行一样的值
附M代码示例(方法一的完整代码参考)
假设你的原表叫Source,可以直接把这段代码粘到高级编辑器里替换原有代码(记得根据实际列名调整):
let Source = 你的数据源, // 替换成你的实际数据源(比如Excel.CurrentWorkbook(){[Name="表1"]}[Content]) Grouped = Table.Group(Source, {"ID"}, {{"分组行", each _, type table [ID=number, Stock Unit=text, Type=text, Has Types=text]}}), AddUnifiedColumns = Table.AddColumns(Grouped, { "统一Stock Unit", each List.First(List.RemoveNulls([分组行][Stock Unit])), "统一Type", each List.First(List.RemoveNulls([分组行][Type])), "统一Has Types", each List.First(List.RemoveNulls([分组行][Has Types])) } ), Expanded = Table.ExpandTableColumn(AddUnifiedColumns, "分组行", {"Stock Unit", "Type", "Has Types"}, {"原Stock Unit", "原Type", "原Has Types"}), FinalTable = Table.RemoveColumns(Expanded, {"原Stock Unit", "原Type", "原Has Types", "分组行"}) in FinalTable
如果操作中有任何疑问,随时说~
备注:内容来源于stack exchange,提问作者newt335




