python - 在熊猫数据框中将列中的值从十六进制转换为二进制
问题描述
我在 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 数据帧。
解决方案
我们可以通过一系列动作来做到这一点:
- 首先我们将十六进制数转换为
int
with.apply(int, base=16)
; - 接下来我们将其转换为二进制数据,使用
.apply(bin)
; - 接下来我们用
.str[2:]
;分块前两个字符 .str[-3:]
然后我们用;获得最后三个字符 和- 最后,我们再次将这些解释为
int
s,其中.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
; 和 - 然后我们按位和 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%。
推荐阅读
- c# - EasyNetQ/RabbitMq:如何在调试期间防止重复消息处理?
- kurento - 在 Kurento 中处理多个流
- mongodb - 如何直接将数据从 MongoDB-3.4 迁移到 MongoDB-4.0?
- angular - 类型“ArrayBuffer”.ts(2339) 上不存在属性“子字符串”
- excel - 检测设置 Excel 的语言并将其显示在文件的单元格中
- python - 是否可以将所有命令行输出导出到文件而无需通过 > 符号手动重定向?
- flutter - 如何根据用户偏好在 Flutter 中选择日期格式
- python - 从不同列表中使用相同索引获取最大值的 Pythonic 方法
- elasticsearch - 如何在弹性搜索和聚合中执行 AND 查询
- python - 如何为numpy数组中的每个类别随机选择1个样本(整数编码)