猿问

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

我在熊猫数据框中有一列带有十六进制值,例如:


Data

1A

2B

BB

FF

A7

78

CB

我想将十六进制值转换为二进制,然后从二进制转换为前 3 位,最后将 3 位值转换为十进制。


二进制数据列将是:


Data

00011010

00101011

10111011

11111111

10100111

01111000

11001011

前 3 位:


Data

010

011

011

111

111

000

011

最后是所需的十进制值:


Data

2

3

3

7

7

0

3

这个怎么做?我尝试使用 bin() 函数,但它不适用于 Pandas 数据框。


PIPIONE
浏览 168回答 2
2回答

子衿沉夜

我们可以通过一系列动作来做到这一点:首先,我们将十六进制数转换为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
随时随地看视频慕课网APP

相关分类

Python
我要回答