【问题标题】:In Power Query, how to replace values in multiple columns with values in another table?在 Power Query 中,如何将多个列中的值替换为另一个表中的值?
【发布时间】:2021-02-22 21:47:10
【问题描述】:

我正在使用 Power BI 中的美国社区调查,并希望将每一列中的值替换为另一个响应标签表中的对应值。例如,种族被编码为 1,2,3,4,5,但我想根据提供的响应标签将其替换为亚洲人、黑人、本地人等。

假设我有下表,其中包含三个变量和人们的反应:

variable1 variable2 variable3
1 2 3
2 3 2
3 1 1
3 3 2
2 2 3

我得到了这个响应键表:

VarName ResponseKey ResponseLabel
variable1 1 blue
variable1 2 red
variable1 3 green
variable2 1 left
variable2 2 right
variable2 3 down
variable3 1 high
variable3 2 medium
variable3 3 low

我想要的是这三个变量,人们的反应是“ResponseLabel”,如下所示:

variable1 variable2 variable3
blue right low
red down medium
green left high
green down medium
red right low

通常我会一个一个地手动替换每个变量,但我宁愿有一个根管,也不愿为数百个变量和 2-100 个响应这样做,所以我想有更好的方法来做到这一点。

到目前为止,我已经考虑过为每个变量制作表格并与原始表格合并,但这听起来也很多。然后我想也许我应该编写一个函数来遍历原始表并一一重新编码每一列。我也想在 M 中可能有一种方法可以做到这一点,但我不确定。

你有什么想法吗? 谢谢!

【问题讨论】:

  • 连接而不是替换不是更容易吗?
  • 你的意思是加入PQ中的表合并还是创建表之间的关系? thx 编辑:澄清一下,有一百多列,每列可以有一百个不同的响应选项。
  • 我认为您可以将这一百多列转为单个列并仅执行一次联接。
  • 就是这样。取消透视两个表,与左外连接合并,展开,完成。
  • 我尝试了连接,但我认为我没有正确地取消透视表。 original table 这是labels 这是merge of the two 这是results expanded,它们是无序的,我不确定如何将其恢复为可用的格式。我哪里做错了?

标签: powerbi powerquery m


【解决方案1】:

假设您的响应键表是 Table1 并加载到 Powerquery 中

对于顶层表,加载到 PowerQuery

添加列...索引列...

右键单击新索引列并...取消透视其他列...

首页 .. 合并查询 ...

设置底表为Table1,点击匹配Attribute与VarName,Value与ResponseKey,左外连接

单击新列顶部的箭头并 [x] 展开 ResponseLabel

右键单击值列并删除

单击选择属性列,然后单击转换 .. 透视列 ... value = ResponseLabel 和 Advanced=dont 聚合

右键单击索引列并删除

完成

完整代码:

let Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),
#"Merged Queries" = Table.NestedJoin(#"Unpivoted Other Columns",{"Attribute", "Value"},Table1,{"VarName", "ResponseKey"},"Table1",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"ResponseLabel"}, {"ResponseLabel"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Table1",{"Value"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "ResponseLabel"),
#"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index"})
in #"Removed Columns1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多