为了账号安全,请及时绑定邮箱和手机立即绑定

在熊猫数据框中将列中的值从十六进制转换为二进制

在熊猫数据框中将列中的值从十六进制转换为二进制

PIPIONE 2021-08-14 12:53:12
我在熊猫数据框中有一列带有十六进制值,例如:Data1A2BBBFFA778CB我想将十六进制值转换为二进制,然后从二进制转换为前 3 位,最后将 3 位值转换为十进制。二进制数据列将是:Data00011010001010111011101111111111101001110111100011001011前 3 位:Data010011011111111000011最后是所需的十进制值:Data2337703这个怎么做?我尝试使用 bin() 函数,但它不适用于 Pandas 数据框。
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我们可以通过一系列动作来做到这一点:

  1. 首先,我们将十六进制数转换为int.apply(int, base=16);

  2. 接下来我们将其转换为二进制数据,使用.apply(bin);

  3. 接下来我们用.str[2:];分割前两个字符

  4. 然后我们用.str[-3:];获得最后三个字符 和

  5. 最后,我们再次将这些解释为ints,带有.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%。


查看完整回答
反对 回复 2021-08-14
?
ITMISS

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


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号