2 回答

TA贡献1828条经验 获得超3个赞
我们可以通过一系列动作来做到这一点:
首先,我们将十六进制数转换为
int
用.apply(int, base=16)
;接下来我们将其转换为二进制数据,使用
.apply(bin)
;接下来我们用
.str[2:]
;分割前两个字符然后我们用
.str[-3:]
;获得最后三个字符 和最后,我们再次将这些解释为
int
s,带有.apply(int, base=2)
。
所以:
>>> df.Data.apply(int, base=16).apply(bin).str[2:].str[-3:].apply(int, base=2)
0 2
1 3
2 3
3 7
4 7
5 0
6 3
Name: Data, dtype: int64
然而,我们可以在这里使用另一种策略:
我们首先将十六进制数转换为int; 和
然后我们按位应用并使用0b111。
例如:
>>> df.Data.apply(int, base=16) & 0b111
0 2
1 3
2 3
3 7
4 7
5 0
6 3
Name: 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%。

TA贡献1871条经验 获得超8个赞
您可以使用:
df.Data.apply(lambda v: int(format(int(v, 16), '08b')[-3:], 2))
这给了你:
0 2
1 3
2 3
3 7
4 7
5 0
6 3
Name: 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
添加回答
举报