使用“List.Zip”替换 Power Query / Power BI / M 代码中的多个列值

Posted

技术标签:

【中文标题】使用“List.Zip”替换 Power Query / Power BI / M 代码中的多个列值【英文标题】:Replace multiple column values in Power Query / Power BI / M code using `List.Zip` 【发布时间】:2021-07-26 15:09:06 【问题描述】:

我有一个 Power Query 表,其中有一列值介于 1 和 12 之间。

我想用一组固定值替换数字,如下表所示。

Period Number   Period Text
1               Jan
2               Feb
3               Mar
4               Apr
5               May
6               Jun
7               Jul
8               Aug
9               Sep
10              Oct
11              Nov
12              Dec

我看到了一个使用List.Zip 的解决方案,它可以“压缩”这些值,如下所示:

periodNumber = Table.Column(#"Prev Step", "Period Number"),
periodText = Table.Column(#"Prev Step", "Period Text"),
#"periodRename" = List.Zip(periodNumber, periodText),

List.Zip 看起来像这样。每条记录内有两个元素。

然后使用它们通过替换为压缩值来重命名列,如下所示:

= Table.RenameColumns(#"Another Prev Step", #"periodRename")

除了Table.RenameColumns,还有什么函数可以利用这个结构?也许某种形式的Table.ReplaceValue

我的表格有一列有 1000 行,并且按如下顺序排列。

Period Number
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
1
2
etc

我想用它们的句号文本替换所有这些句号。

我喜欢使用List.Zip 的想法,因为它提供了一个动态的周期列表,因为有时数据不会包含完整的 12 个周期,例如只有 3 个周期。期间也可以是季度,例如 periodNumber = [1, 2, 3, 4] 和 periodText = [Q1, Q2, Q3, Q4] 或年份。

是否有其他方法可以使用List.Zip 替换表值向下一列而不是跨表列?

注意:期间编号与特定月份不对应。开始可以是任何一个月,为期 12 个月。所以他们的时期文本会改变。因此需要动态获取它们。

【问题讨论】:

大多数人只是合并到一个日期表中 【参考方案1】:

试试:

monthName = Table.TransformColumns(#"Previous Step","Period Number", each Date.MonthName(#date(2020, _,1)))

转换前

转换后

编辑:使用变换的其他方式

months = "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",
...
translate = Table.TransformColumns(#"Previous Table Step","Period Number", each months_-1)

使用您的 List.Zip如果映射是随机的,则很有用

 translationList = List.Zip(1,2,3,4,5,6,7,8,9,10,11,12,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),
...
translate = Table.TransformColumns(typeIt,"Period Number", each 
                    List.Range(List.Combine(translationList),
                        List.PositionOf(List.Combine(translationList),_)+1,1)0)

【讨论】:

我应该将此添加到我的问题中。期间编号与特定月份不对应。开始可以是任何一个月,为期 12 个月。所以他们的时期文本会改变。因此需要动态获取它们。 @curtisp 您仍然可以使用列转换方法。您只需将数字映射到它所代表的任何月份。如何做到这一点取决于数字和月份之间的关系。最复杂的情​​况是关系是随机的。但如果它是连续的,那么使用这种技术会非常简单。 期间编号和期间文本的关系在List.Zip 中。所以我正在寻找访问它的方法来填充而不是跨列。它将是动态的。 List.Zip 记录计数将是动态的,文本值也是如此。 @curtisp 我已经编辑了我的问题,以演示获得所需结果的其他一些方法。包括使用您的List.Zip,如果映射是随机的,这将很方便。 @curtisp 很高兴它对你有用。我建议您将列表设置为List.Combine(List.Zip(...),而不是在转换操作中多次执行List.Combine。请注意,returnValue 始终在 lookupValue lookupValue postion+1 处进行索引。如果速度有问题,你甚至可以缓冲它。

以上是关于使用“List.Zip”替换 Power Query / Power BI / M 代码中的多个列值的主要内容,如果未能解决你的问题,请参考以下文章

Power8 vsldoi 内置或替换

Power Query 自定义列查找和替换

Power Query - 替换新列中的文本

Power Query / Power BI - 用另一列中的值替换空值

Power Query - 用零替换负数

Power Query:根据其他列替换值