我在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()函数,但不适用于熊猫数据框。
答案 0 :(得分:3)
我们可以通过一系列操作来做到这一点:
int
将十六进制数转换为.apply(int, base=16)
; .apply(bin)
将其转换为二进制数据; .str[2:]
分割前两个字符; .str[-3:]
获得最后三个字符;和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
但是我们可以在这里使用另一种策略:
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%。
答案 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