有效转换熊猫.Python中布尔值到字符串的系列



我有一个在大型数据帧上运行的遗传算法。每个人进化出一个过滤器,然后对过滤后的数据进行一系列计算。我认为缓存结果可能会提高我的表现。

过滤数据帧(例如"Col a">12.3(会返回一个pandas系列布尔值,其长度与我的数据相同(约为100K个条目(。计算结果的实际大小可以忽略不计。

我需要如何将这一系列布尔值转换为一个位字段字符串的想法,我可以将其粘贴到字典中。任何其他钥匙也可以,但空间是一个考虑因素。我将尝试一些包,bitstruct和bitarray,但由于我在numpy和panda方面没有那么丰富的经验,我想问一下,以防我错过了一些明显的东西。

提前谢谢。

我有一些时间来解决我的问题。我并不声称我有最快的解决方案,但至少对我来说,这似乎是可以接受的。

假设您有一个加载为panda数据帧的大型数据集,然后从该数据集中进行选择。

选择=(数据["Col1"]>=0.2(&(数据["Col2"]>=0.5(

选择现在是一个pandas.core.series.布尔值系列,每行一个,用于指定该行是否包含(True(或不包含(False(。我的目标是有效地将该系列转换为一个可以用作字典键的压缩字符串。

def genkey(bseries):
line = bseries.values.tobytes()
lst = [line[i:i+8] for i in range(0, len(line), 8)]
#return ''.join([chr(sum([ord(y)<<x for x,y in enumerate(j)])) for j in lst]) # this line is the vast majority of time.
retstr = ''
for j in lst[:-1]:
#retstr += chr((ord(j[0]) << 7) + (ord(j[1]) << 6) + (ord(j[2]) << 5) + (ord(j[3]) << 4) + (ord(j[4]) << 3) + (ord(j[5]) << 2) + (ord(j[6]) << 1) + ord(j[7]))
# in python 3 use
retstr += chr(( j[0] << 7) + (j[1] << 6) + (j[2] << 5) + (j[3] << 4) + (j[4] << 3) + (j[5] << 2) + (j[6] << 1) + j[7])
j = lst[-1] # last value can be less than 8
if len(j) < 8:
j = j + b'x00' * (8 - len(j) )
retstr += chr(( j[0] << 7) + (j[1] << 6) + (j[2] << 5) + (j[3] << 4) + (j[4] << 3) + (j[5] << 2) + (j[6] << 1) + j[7])
return retstr

genkey(selection(将返回一个我可以使用的字符串。

在撰写本文时,我不知道我的缓存机制是否值得付出这些努力。我不知道缓存命中是否会频繁发生,以证明成本合理。我想过几天我就会知道这是否值得。如果你有类似的问题——祝你好运!

最新更新