Конвертировать значения в столбце из шестнадцатеричного в двоичный в панде данных - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть один столбец во фрейме данных 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.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Мы можем сделать это с помощью цепочки действий:

  1. сначала мы конвертируем шестнадцатеричное число в int с .apply(int, base=16);
  2. затем мы конвертируем это в двоичный файлdata, с .apply(bin);
  3. , затем мы разбиваем первые два символа на .str[2:];
  4. , затем мы получаем последние три символа с .str[-3:]
  5. наконец, мы снова интерпретируем их как 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

Мы можем использовать другую стратегию здесь:

  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% быстрее.

0 голосов
/ 12 ноября 2018

Вы можете использовать:

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 символа этой строки [-3:] ('010') и преобразуйте ее в десятичное число с основанием 2, int(binary_string[-3:], 2) даст вам: 2
...