首页 > 解决方案 > 将分类变量转换为数值 PowerQuery

问题描述

我的表中有许多列,它们的文本值属于类别 - 例如,列“ABC”有 9000 行,但每一行都必须在集合 {“A”、“B”、“C”} 中有一个值。性别等其他列有“M”/“F”/null

对于每一列,我想将其就地转换为整数列表 - 所以 A:1、B:2、C:3 等。

我一直在尝试使用List.Distinct将值提取到临时表中,向其中添加索引列,并使用连接根据临时表中的映射来转换初始列。然而,这似乎很慢,我不确定如何在我的表中的所有列上运行它(或者至少Table.ColumnsOfType(Source, {type nullable text})选择分类列......)。

有什么建议么?

性别 水果 [...]
F
F
柠檬
柠檬
无效的

性别 水果 [...]
1 1
1 2
2 3
2 2
2 3
无效的 1
2 2

标签: powerbipowerquerycategorical-datam

解决方案


在 PowerQuery 中,这似乎适用于任意数量的列

用其他东西替换所有空值,这里 +=+

添加索引

反透视

删除重复项

组,为每个组添加索引

在此处输入图像描述

合并回原来的并展开

转轴

删除多余的列

之前和之后:

在此处输入图像描述

完整代码:

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Replaced Value" = Table.ReplaceValue(Source,null,"+=+",Replacer.ReplaceValue,Table.ColumnNames(Source)),
#"Added Index" = Table.AddIndexColumn(#"Replaced Value", "Index", 0, 1),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),

// derive a table of replacements
#"Removed Duplicates" = Table.Distinct(#"Unpivoted Other Columns", {"Attribute", "Value"}),
#"Grouped Rows" = Table.Group(#"Removed Duplicates", {"Attribute"}, {{"GRP", each Table.AddIndexColumn(_, "Index2", 1, 1), type table}}),
#"Expanded GRP" = Table.ExpandTableColumn(#"Grouped Rows", "GRP", {"Value", "Index2"}, {"Value", "Index2"}),

//replace originals
#"Merged Queries" = Table.NestedJoin(#"Unpivoted Other Columns",{"Attribute", "Value"},#"Expanded GRP",{"Attribute", "Value"},"EG",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "EG", {"Index2"}, {"Index2"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Table1",{"Value"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "Index2", List.Sum),
#"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index"})
in #"Removed Columns1"

推荐阅读