我有一个数据集,为了简单起见,我将只指出一个主要的功能- postalCode。我需要通过函数调用获得另一个功能(这个地区的主要邮局),并添加到dataframe(示例)。
两者都是整数。
| 邮政编码|主要邮政编码|
| - ------|- ------|
| 小行星123|小行星123|
| 小行星23456|小行星23407|
| 小行星345|小行星34504|
关于功能的一些词汇:它取postalCode的前3位数,然后从所有邮政编码的列表中取最小值,从这3位数开始。
在这个列表中,你并不总能找到类似XXX 01的值,它可以是XXX 05、XXX 07或XXX(任何其他值),让我们假设它可以是任何数字。
邮政编码列表如下所示(约40 K个元素):
zipcode = [1001,1002,...,99999]
我的函数如下所示:
def findMainPostOffice(num):
''' takes zip and returns nearest available main zip in list 'zipcode' '''
start = int(str(num // 100) + '00')
m = min([i for i in zipcode if i > start and i < num], default=num)
return m
我这样调用这个函数:
df['mainPostCode'] = df.postalCode.apply(findMainPostOffice)
问题是这个功能需要很长的时间。在我的数据集上应该需要大约72个小时。你能帮我加快这个速度吗?
4条答案
按热度按时间yiytaume1#
IIUC,您可以使用
groupby
查找最小值(主邮政编码)输入:
31moq8wy2#
你应该尽可能多地把计算移出函数。
对于任何前缀,我们都需要最低的主要邮政局,这样我们就可以创建一个前缀到主要邮政编码的Map,因为只有
1000
个可能的前缀,所以不会占用太多空间。一种方法是为所有可能的邮政编码创建一个前缀字典,对于邮政编码
[10001, 10002, 20010, 20004]
的列表,我们创建一个Map:我们不关心邮政编码
10001
或20010
,因为我们永远不会返回它们。通过只创建一次Map,并多次使用它,我们不必在每次搜索邮政编码时检查整个列表。
下面是生成Map的代码:
下面是使用前缀_map的代码
nzkunb0c3#
我添加另一个答案,因为我的理解完全不同,所以方法也不同。您可以使用
merge_asof
:nwlqm0z14#
预排序邮政总局邮政编码和使用二进制搜索。