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

时间:2018-11-11 21:06:57

标签: python pandas dataframe binary hex

我在pandas数据框中有一个具有十六进制值的列,例如:

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()函数,但不适用于熊猫数据框。

2 个答案:

答案 0 :(得分:3)

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

  1. 首先,我们用int将十六进制数转换为.apply(int, base=16)
  2. 接下来,我们使用.apply(bin)将其转换为二进制数据;
  3. 接下来,我们用.str[2:]分割前两个字符;
  4. 然后我们用.str[-3:]获得最后三个字符;和
  5. 最后,我们再次用int将它们解释为.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

但是我们可以在这里使用另一种策略:

  1. 我们首先将十六进制数转换为int;和
  2. 然后我们按位应用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%。

答案 1 :(得分:2)

您可以使用:

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个字符并将其转换为以2为底的十进制形式,int(binary_string[-3:], 2)为您提供:2