前言
上一篇说到,最近我在做地址匹配的一个竞赛,目前陷入了瓶颈,所以想从pandas效率上玩玩。
比如给出一个切分好的地址列表,如[‘福建省’, ‘厦门市’, ‘思明区’, ‘梧村街道’, ‘湖滨南路’],需要将这个地址在140+万条数据的地址库里筛选出满足条件的所有地址,应该怎么做呢?
一、常规方法
最常规的方法肯定是直接使用pandas里面的筛选方法,如下面代码所示
可以看到用时大概在843毫秒左右
这个方法的好处是书写简单,无脑&就可以了,但是如果当中某个对象可能是空的而且需要同时对很多地址进行批量筛选怎么办?
如果还是有老办法的话,出来的结果肯定是不对的
二、map方法
在https://blog.csdn.net/qq_38727626/article/details/100164430这篇文章中提到可以用map的方法来重新书写,我们改进一下看看效率
提取是提出来了,但是这时间也太长了:2.36秒
看来map的方法少量用可以,大批量肯定不合适
三、def方法
map太慢的原因,主要在于它每次在计算一个特征(如city)时都会从头运算一遍,而第一种常规筛选则是筛选好一个条件后再在这个基础上做二次筛选。
所以为了兼顾效率和空值,可以尝试自定义函数的方法:
good!结果显示正常,而且速率也仅317ms
四、一步步筛选
那还有没有更快的筛选方法呢?肯定还有,至少我试出了以下方法:
我这里用了倒查的方式,从最底层的street开始查,竟然只有79.8ms
如果换成正查会不会有什么变化呢?使用%%timeit试验了一下,结果如下:
正查:
倒查:
看来是有明显区别的
结论
从上面试验可以知道,在多重筛选时,如果数量不大可以使用常规方法,如果是大批量且部分值不一定有值,则可以尝试一步步筛选,且从筛选结果最明显的特征开始。