PQ算法调优 | 充分利用分组功能,提升数据处理效率 - 1:从分类加索引问题谈起

2021-08-31 10:46:59 浏览数 (1)

很多朋友在用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算法调优的内容。

0 人点赞