Power Query合并列透视后,动态填充hazard assessment conclusion空白值
问题描述
我有一个生成源数据表的函数,原本想通过合并Route和Custom列,再对Value列做透视,把合并后的行转成对应的列名。但操作后发现,"hazard assessment conclusion"(危害评估结论)被当成了独立的列名,现在需要修改逻辑,让危害评估结论依赖Route值,填充对应的空白单元格。需要动态解决方案,实际要处理数百行同格式数据。
现有M代码:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], #"Merged Columns" = Table.CombineColumns(Source,{"Route", "Custom"},Combiner.CombineTextByDelimiter("#(lf)", QuoteStyle.None),"Merged"), #"Pivoted Column" = Table.Pivot(#"Merged Columns", List.Distinct(#"Merged Columns"[Merged]), "Merged", "Value") in #"Pivoted Column"
示例数据:
| 名称 | 接触途径 | 自定义项 | 值 |
|---|---|---|---|
| 柠檬酸 | 吸入 | 危害评估结论 | 未识别出危害 |
| 柠檬酸 | 皮肤接触 | 危害评估结论 | 中等危害 |
| 柠檬酸 | 口服 | 危害评估结论 | 未识别出危害 |
| 二丙二醇醚 | 吸入 | DNEL(推导无效应水平) | 70 mg/m³ |
| 二丙二醇醚 | 吸入 | NOAEC | 351 mg/m³ |
| 二丙二醇醚 | 皮肤接触 | DNEL(推导无效应水平) | 51 mg/kg bw/day |
| 二丙二醇醚 | 皮肤接触 | NOAEL | 1010 mg/kg bw/day |
| 二丙二醇醚 | 口服 | DNEL(推导无效应水平) | 24 mg/kg bw/day |
| 二丙二醇醚 | 口服 | NOAEL | 470 mg/kg bw/day |
解决方案
核心思路是先给每个条目生成明确关联Route的列名,确保「危害评估结论」不会单独成列,再执行透视操作,完全适配动态数据场景。
通用版代码
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], // 生成绑定Route的列名:格式为「接触途径 - 自定义项」 #"生成列名" = Table.AddColumn(Source, "列名", each [Route] & " - " & [Custom]), // 动态透视所有列名,按Name分组 #"透视列" = Table.Pivot( #"生成列名", List.Distinct(#"生成列名"[列名]), "列名", "Value" ) in #"透视列"
可选:调整结论列格式
如果希望把「危害评估结论」作为列名前缀(比如「危害评估结论 - 吸入」),可以用以下代码:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], #"生成列名" = Table.AddColumn(Source, "列名", each if [Custom] = "Hazard assessment conclusion" then "危害评估结论 - " & [Route] else [Route] & " - " & [Custom] ), #"透视列" = Table.Pivot( #"生成列名", List.Distinct(#"生成列名"[列名]), "列名", "Value" ) in #"透视列"
关键说明
- 新增的「列名」列明确关联了Route和Custom,彻底避免透视时出现独立的结论列。
List.Distinct自动识别所有生成的列名,无需手动指定,完美适配数百行的动态数据。- 透视后空白单元格会保留,若需要填充默认值,可在透视后添加
Table.FillNulls步骤(比如Table.FillNulls(#"透视列", {"列名1", "列名2"}, "无数据"))。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

