Мы можем сделать это с помощью цепочки действий:
- сначала мы конвертируем шестнадцатеричное число в
int
с .apply(int, base=16)
; - затем мы конвертируем это в двоичный файлdata, с
.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
;и - , тогда мы применяем побитовое и с
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% быстрее.