很多朋友在用Power Query处理数据时遇到效率问题,其中最常见的就是通过Table.SelectRows函数进行筛选数据并处理的情况。
这里先从一个简单的问题讲起:怎么给表里的每一类内容分别添加索引?比如有表如下图所示:
希望对各省份下的城市加个编码,如下图所示:
对于这个问题,我们常规的解法是先添加索引列,然后根据索引列所标志的当前行应用Table.RowCount和Table.SelectRows函数来得到从第1行到当前行的某分类的所有行数,从而得到相应的结果,具体写法如下:
代码语言:javascript复制= Table.RowCount(
Table.SelectRows(
已添加索引,
(t)=>t[省份]=[省份] and t[索引]<=[索引]
)
)
使用该方法,其通用性较强,各种统计条件可以用Table.SelectRows函数来控制,但是,这个方法一是公式写起来稍嫌繁琐,更大的问题是,如果数据量比较大,使用该方法的效率可能会比较低,因为需要一次又一次地去调用从第1行至当前行数据所形成的表,假设这个表的数据增加至1万行,刷新数据的效率就已经很低了(每秒只能加载约20行数据!):
那么,就这个问题来说,如果通过分组来解,你会发现,其方法更简洁,而且效率会非常高。具体如下:
Step 01 分组
显然,通过分组操作,我们将得到每个类别及其所对应的内容(表),如下图所示:
这时,假如说,我们可以对各类别(省份)下的每个表直接添加索引列,那么,不就可以得到各类别下的编号了吗?
于是,我们修改其中的代码如下:
即,将原来用下划线表示的每个表,通过Table.AddIndexColumn(_,"编号",1,1)来直接增加索引列——不要告诉我你记不住这个函数,因为即使记不住,你也很容易通过点击一下“添加索引列”的按钮来生成一个步骤,从而获得这个函数的写法——其实,很多时候都可以通过操作来获得Table类函数的使用方法。
接下来对数据进行展开即可,如下图所示:
结果如下图所示:
此时,效率提升非常明显:2秒不到全部加载完毕!
具体情况大家可以自行造个简单的数据试一下并加深理解,后续我还会分享更多关于PQ算法调优的内容。