powerbi - 将分类变量转换为数值 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 |
解决方案
在 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"
推荐阅读
- python - 执行python后cmd窗口不关闭
- javascript - Threejs——加载模型并让它们旋转/移动到位
- visual-studio-code - 为什么我的 VSC 的 Intellisense 代码完成预测“.toLoweCase()”方法而不是“.substring()”
- django - 如何在呈现之前过滤模型查询集
- api - 如何使用 discord api 发送图像消息?
- nginx - Nginx:需要 http_name 域的映射函数
- reactjs - Uploading a CSV and Creating a chart - react
- javascript - 将特定颜色交换为图像 javascript
- javascript - document.getElementById 没有在我的 React 组件中动态更改样式
- r - 如果在函数中,evalq 如何在正确的环境中获取文件