PowerBI:Power Query:处理由于数据透视而改变的列名
PowerBI: Power Query: Dealing with changing column names due to pivots
对于我正在做的报告。我有一个日期列。我从该列中提取月份,然后旋转月份。
例如,我可能有一个 table 像:
Part#
Month
Qty
1
1
10
1
2
10
1
3
10
1
4
10
1
5
10
1
6
10
当我转动它时它变成:
Part#
1
2
3
4
5
6
1
10
10
10
10
10
10
然后我重命名这些列并执行一些其他任务,例如创建一列最大值。
但是,由于我提取的数据只有 6 个月的价值。这些列名称将更改。
将来可能是:
Part#
4
5
6
7
8
9
1
10
10
10
10
10
10
所以这样一行:
Table.ReplaceValue(#"Pivoted Column",null,0,Replacer.ReplaceValue,{"1", "2", "3", "4", "5", "6"})
将在列为 4、5、6、7、8、9 时产生错误。有办法处理这个问题吗?
您可以使用 TableColumNames
获取列名列表,然后您可以转换该列表。所以对于你的例子,你可以使用类似的东西:
= Table.ReplaceValue(#"Pivoted Column",null,0,Replacer.ReplaceValue,List.Skip(Table.ColumnNames(#"Pivoted Column"),1))
您需要手动编写一个步骤来重命名数据透视表后的列。
此 M 代码从 Excel 中的当前工作簿中提取一个 table,就像您示例中的那个一样,然后按照您的描述旋转,然后将列重命名为 Part#, 1st, 2nd,第三,第四,第五和第六。是的,我说它重命名为 Part#,尽管它并没有真正改变该列名称。确保在步骤中编码的列表中包含部件号,即使部件号名称并没有真正改变,因为您需要考虑 Table.ColumnNames 提取的所有列名称。将第 1、2、3、4、5 和 6 替换为您 所需的列名。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(Source, {{"Month", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(Source, {{"Month", type text}}, "en-US")[Month]), "Month", "Qty"),
#"Renamed Columns" = Table.RenameColumns(#"Pivoted Column", List.Zip({Table.ColumnNames(#"Pivoted Column"),{"Part#", "1st", "2nd", "3rd", "4th", "5th", "6th"}}))
in
#"Renamed Columns"
List.Zip 将两个列表交织在一起。在这里,它从原始列名称(“透视列”步骤的 table 中的那些)交织 Part#,然后将列表中的 Part# 编码为 #"Renamed Columns,然后是下一个原始列名称(1 来自您的第一个示例或第二个示例中的 4),然后列列表中的第一个编码为#“重命名列”,然后是下一个原始列名称(第一个示例中的 2 或第二个示例中的 5),然后列列表中的第二个编码进入 #"Renamed Columns,等等。这会设置 Table.RenameColumns.
所需的列表
对于我正在做的报告。我有一个日期列。我从该列中提取月份,然后旋转月份。
例如,我可能有一个 table 像:
Part# | Month | Qty |
---|---|---|
1 | 1 | 10 |
1 | 2 | 10 |
1 | 3 | 10 |
1 | 4 | 10 |
1 | 5 | 10 |
1 | 6 | 10 |
当我转动它时它变成:
Part# | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
1 | 10 | 10 | 10 | 10 | 10 | 10 |
然后我重命名这些列并执行一些其他任务,例如创建一列最大值。 但是,由于我提取的数据只有 6 个月的价值。这些列名称将更改。 将来可能是:
Part# | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|
1 | 10 | 10 | 10 | 10 | 10 | 10 |
所以这样一行:
Table.ReplaceValue(#"Pivoted Column",null,0,Replacer.ReplaceValue,{"1", "2", "3", "4", "5", "6"})
将在列为 4、5、6、7、8、9 时产生错误。有办法处理这个问题吗?
您可以使用 TableColumNames
获取列名列表,然后您可以转换该列表。所以对于你的例子,你可以使用类似的东西:
= Table.ReplaceValue(#"Pivoted Column",null,0,Replacer.ReplaceValue,List.Skip(Table.ColumnNames(#"Pivoted Column"),1))
您需要手动编写一个步骤来重命名数据透视表后的列。
此 M 代码从 Excel 中的当前工作簿中提取一个 table,就像您示例中的那个一样,然后按照您的描述旋转,然后将列重命名为 Part#, 1st, 2nd,第三,第四,第五和第六。是的,我说它重命名为 Part#,尽管它并没有真正改变该列名称。确保在步骤中编码的列表中包含部件号,即使部件号名称并没有真正改变,因为您需要考虑 Table.ColumnNames 提取的所有列名称。将第 1、2、3、4、5 和 6 替换为您 所需的列名。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(Source, {{"Month", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(Source, {{"Month", type text}}, "en-US")[Month]), "Month", "Qty"),
#"Renamed Columns" = Table.RenameColumns(#"Pivoted Column", List.Zip({Table.ColumnNames(#"Pivoted Column"),{"Part#", "1st", "2nd", "3rd", "4th", "5th", "6th"}}))
in
#"Renamed Columns"
List.Zip 将两个列表交织在一起。在这里,它从原始列名称(“透视列”步骤的 table 中的那些)交织 Part#,然后将列表中的 Part# 编码为 #"Renamed Columns,然后是下一个原始列名称(1 来自您的第一个示例或第二个示例中的 4),然后列列表中的第一个编码为#“重命名列”,然后是下一个原始列名称(第一个示例中的 2 或第二个示例中的 5),然后列列表中的第二个编码进入 #"Renamed Columns,等等。这会设置 Table.RenameColumns.
所需的列表