首页 > 解决方案 > 在熊猫数据框中将列中的值从十六进制转换为二进制

问题描述

我在 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() 函数,但它不适用于 pandas 数据帧。

标签: pythonpandasdataframebinaryhex

解决方案


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

  1. 首先我们将十六进制数转换为intwith .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

然而,我们可以在这里使用另一种策略:

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


推荐阅读