10万行30列数据乘上系数,能快一些吗?含“函数作为参数”的触类旁通方法
- 问题:简单操作法卡出翔 -
小勤:前面讲到一个多列数据乘上一个系数的问题,《将多列的数据都乘上一个系数,Power Query里怎么操作比较简单?》,里面采用了逆透视成一列数据然后再透视回去的方法,操作比较简单,但是……
——我有78000+多个物料,每个物料有30列左右,现在加乘的做法那个慢啊,完全没法忍!
大海:的确,前面所述的方法从操作的角度来说,是比较方便的,但数据量大了效率就会很低。
- 改进1:直接转换法 -
小勤:那怎么办呢?
大海:那就要考虑换个办法了,尽量实现直接的转换。比如说,我们在做转换的时候,虽然只能对一列进行加乘,但是可以对多个列同时做其他处理的,比如更改类型、舍入等等,如下图所示:
小勤:这有什么用啊?
大海:这样操作后,我们就对多列进行了转换,虽然不是按需要得到直接的加乘,但是得到了一个转换的公式,这样我们就可以直接改里面的转换参数了:
你看,这里面是对每一列都取2位小数,所以我们直接把这个参数改掉即可。
小勤:晕啊,每一个都得改?PQ里又不支持替换!
大海:那不是可以拷到文本或word文件里替换然后再拷回来吗?替换后修改参数如下,即将所有的Number.Round(_,2)替换为_*系数:
小勤:好吧,虽然有点儿周折,但也还能接受。还有更好的办法吗?
- 改进2:直接替换法 -
大海:实际上,我们还可以用替换(ReplaceValue)而不是转换(TransformColumns)的方式来实现,这样可以直接在PQ里简单改参数就可以了,比如我们先选定所有要加乘的列,然后做个简单的替换(如0替换为0)以生成公式:
这时,生成的步骤公式如下:
我们只要把其中的Replacer.ReplaceValue参数(数据替换的方法)改掉即可,具体修改如下:
这样,我们也得到了需要的结果,而且效率还不错。
- 引申:搞懂函数作为参数 -
小勤:这是什么操作?为什么搞个三个参数(xyz)的自定义函数,然后又只用其中的一个(x)?
大海:这是Table.ReplaceValue中第三个参数(数据替换方法)的使用方式,其中的x是要进行替换的初始值,也就是我们表里的每一个原始内容,y就是我们输入的要查找的值(0),z就是我们要替换为的值(0),如下图所示:
小勤:因为我们这里不需要真正做什么替换,而只是将内容乘一个系数,所以只要x*系数就可以了,而不需要用的y和z?
大海:对的。
小勤:但是,我怎么知道这个自定义函数应该这样写啊?PQ里的帮助也没有这样的说明啊。
大海:PQ里针对函数用作参数的说明的确是不够详细的,但是,这里有一个通用的辅助理解模式:
如果你想知道一个函数【默认生成的Replacer.ReplaceValue,或我们改的(x,y,z)=>...】作为参数时,这个函数的参数应该是怎样的,那你可以去查默认生成的公式里所使用的函数(Replacer.ReplaceValue)的参数:
小勤:啊!原来可以这样去理解,因为Replacer.ReplaceValue有3个参数的,所以,我们如果要自己去写自定义的函数的话,就应该是用3个参数的?
大海:基本都可以这样理解。而且,我们可以看到,相应的参数顺序大致跟我们操作时所选择的内容以及输入的数据顺序一致。
小勤:嗯。先选定多列(x),然后输入要查找的值(y),然后输入要替换的值(z)……
大海:对的。
小勤:这个理解函数作为参数的方式真是太有用了。以前一直蒙圈啊!
大海:你再结合这个例子多想想,相信你很快就能触类旁通了。