在 Power-Query 中枚举文本值
Enumerate Text Values in Power-Query
我的 table 中有一列包含一些文本值 (input),我想将其转换为数字 (output) 对于每个唯一的文本值,这样我就可以做一些回归分析:
Input
Output
AOP
1
AOS
2
AOS
2
AOS
2
AOP
1
null
0 or null
AOP
1
我最初尝试通过几个 Transform: Replace Values
步骤来做到这一点,但我不知道如何:
- 使其灵活地适应不同数量的唯一值(不是硬编码 3 替换而是处理
n
,其中 n
是 input 中唯一值的数量)
- 对我的 table
的许多专栏重复此操作
- 尽可能避免循环
什么是更好的方法?
一种方法是使用以下公式添加自定义列,并为您希望应用它的每一列执行此操作,使用每个文本字符的值生成一个唯一的数字
= try
List.Accumulate(Text.ToList([Input]), "", (state, current)=>
state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null
这会将所有列的文本转换为唯一数字,替换原始数据:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Function = (x) => try List.Accumulate(Text.ToList(x), "", (state, current)=> state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null,
TransformList = List.Transform(Table.ColumnNames(Source), each {_ , Function}),
Output = Table.TransformColumns(Source, TransformList)
in Output
这会将所有列的文本转换为唯一数字,将新列附加到现有列:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Function = (x) => try List.Accumulate(Text.ToList(x), "", (state, current)=> state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null,
TransformList = List.Transform(Table.ColumnNames(Source), each {_ , Function}),
Output = Table.TransformColumns(Source, TransformList),
Numericals=Table.RenameColumns( Output, List.Zip( { Table.ColumnNames( Output), List.Transform(Table.ColumnNames(Output), each _ &"number") } ) ),
#"Merged Queries" = Table.NestedJoin(Table.AddIndexColumn(Source, "Index", 0, 1),{"Index"},Table.AddIndexColumn(Numericals, "Index2", 0, 1),{"Index2"},"Tabl2",JoinKind.LeftOuter),
#"Expanded Tabl2" = Table.ExpandTableColumn(#"Merged Queries", "Tabl2", Table.ColumnNames( Numericals),Table.ColumnNames( Numericals)),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Tabl2",{"Index"})
in #"Removed Columns"
我的 table 中有一列包含一些文本值 (input),我想将其转换为数字 (output) 对于每个唯一的文本值,这样我就可以做一些回归分析:
Input | Output |
---|---|
AOP | 1 |
AOS | 2 |
AOS | 2 |
AOS | 2 |
AOP | 1 |
null | 0 or null |
AOP | 1 |
我最初尝试通过几个 Transform: Replace Values
步骤来做到这一点,但我不知道如何:
- 使其灵活地适应不同数量的唯一值(不是硬编码 3 替换而是处理
n
,其中n
是 input 中唯一值的数量) - 对我的 table 的许多专栏重复此操作
- 尽可能避免循环
什么是更好的方法?
一种方法是使用以下公式添加自定义列,并为您希望应用它的每一列执行此操作,使用每个文本字符的值生成一个唯一的数字
= try
List.Accumulate(Text.ToList([Input]), "", (state, current)=>
state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null
这会将所有列的文本转换为唯一数字,替换原始数据:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Function = (x) => try List.Accumulate(Text.ToList(x), "", (state, current)=> state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null,
TransformList = List.Transform(Table.ColumnNames(Source), each {_ , Function}),
Output = Table.TransformColumns(Source, TransformList)
in Output
这会将所有列的文本转换为唯一数字,将新列附加到现有列:
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Function = (x) => try List.Accumulate(Text.ToList(x), "", (state, current)=> state&Number.ToText(Character.ToNumber(current), "0000")) otherwise null,
TransformList = List.Transform(Table.ColumnNames(Source), each {_ , Function}),
Output = Table.TransformColumns(Source, TransformList),
Numericals=Table.RenameColumns( Output, List.Zip( { Table.ColumnNames( Output), List.Transform(Table.ColumnNames(Output), each _ &"number") } ) ),
#"Merged Queries" = Table.NestedJoin(Table.AddIndexColumn(Source, "Index", 0, 1),{"Index"},Table.AddIndexColumn(Numericals, "Index2", 0, 1),{"Index2"},"Tabl2",JoinKind.LeftOuter),
#"Expanded Tabl2" = Table.ExpandTableColumn(#"Merged Queries", "Tabl2", Table.ColumnNames( Numericals),Table.ColumnNames( Numericals)),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Tabl2",{"Index"})
in #"Removed Columns"