子衿沉夜
我们可以通过一系列动作来做到这一点:首先,我们将十六进制数转换为int用.apply(int, base=16);接下来我们将其转换为二进制数据,使用.apply(bin);接下来我们用.str[2:];分割前两个字符然后我们用.str[-3:];获得最后三个字符 和最后,我们再次将这些解释为ints,带有.apply(int, base=2)。所以:>>> df.Data.apply(int, base=16).apply(bin).str[2:].str[-3:].apply(int, base=2)0 21 32 33 74 75 06 3Name: Data, dtype: int64然而,我们可以在这里使用另一种策略:我们首先将十六进制数转换为int; 和然后我们按位应用并使用0b111。例如:>>> df.Data.apply(int, base=16) & 0b1110 21 32 33 74 75 06 3Name: Data, dtype: int64第二次尝试不仅更简单,而且速度也更快,大约提高了 66%:>>> timeit(first_strategy, number=10000)6.962630775000434>>> timeit(second_strategy, number=10000)2.330652763019316对于重复样本数据 100 次的数据帧,我们得到:>>> timeit(first_strategy, number=10000)17.603060900000855>>> timeit(second_strategy, number=10000)5.901462858979357这又快了 66%。
ITMISS
您可以使用:df.Data.apply(lambda v: int(format(int(v, 16), '08b')[-3:], 2))这给了你:0 21 32 33 74 75 06 3Name: Data, dtype: int64这些步骤是:获取原始数据并使用int(number, 16)(基数 16 为十六进制)(int('1A', 16)== 26)将其转换为十进制取该数字并将其格式化为二进制字符串,format(number, '08b')为您提供一个由 0/1 的零填充在左侧的字符串 ( format(26, '08b')== '00011010')取该字符串[-3:]( '010')的最后 3 个字符并将其转换为以 2int(binary_string[-3:], 2)为基数的十进制,为您提供:2