Как поменять местами каждое значение в столбце по битам для шестнадцатеричного числа? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть фрейм данных, в котором есть столбец с именем hexa, который имеет шестнадцатеричные значения, подобные этому. Они относятся к объекту dtype.

               hexa
0  00802259AA8D6204
1  00802259AA7F4504
2  00802259AA8D5A04

Я хотел бы удалить первый и последний биты и поменять значения по битам следующим образом:

         hexa-rev
0  628DAA592280
1  457FAA592280
2  5A8DAA592280

Пожалуйста, помогите

1 Ответ

0 голосов
/ 06 марта 2020

Я покажу вам полное решение здесь, а затем объясню его части ниже:

def reverse_bits(bits):
    trimmed_bits = bits[2:-2]
    list_of_bits = [i+j for i, j in zip(trimmed_bits[::2], trimmed_bits[1::2])]
    reversed_bits = [list_of_bits[-i] for i in range(1,len(list_of_bits)+1)]
    return ''.join(reversed_bits)

df['hexa-rev'] = df['hexa'].apply(lambda x: reverse_bits(x))

Возможно, есть несколько способов сделать это, но этот способ должен решить вашу проблему. Общая стратегия будет определять функцию, а затем использовать метод apply (), чтобы применить ее ко всем значениям в столбце. Это должно выглядеть примерно так:

df['hexa-rev'] = df['hexa'].apply(lambda x: reverse_bits(x))

Теперь нам нужно определить функцию, которую мы собираемся применить к нему. Разбивая его на части, мы удаляем первый и последний бит по индексу. Из-за того, как работают отрицательные индексы, это исключит первый и последний бит, независимо от размера. Ваш результат - список символов, которые мы объединим после обработки.

def reverse_bits(bits):
    trimmed_bits = bits[2:-2]

Вторая строка перебирает список символов, сопоставляет первый и второй символ каждого бита вместе, а затем объединяет их в одну строку, представляющую бит.

def reverse_bits(bits):
    trimmed_bits = bits[2:-2]
    list_of_bits = [i+j for i, j in zip(trimmed_bits[::2], trimmed_bits[1::2])]

Со второй по последнюю строку возвращается список, который вы только что создали в обратном порядке. Наконец, функция возвращает одну строку битов.

def reverse_bits(bits):
    trimmed_bits = bits[2:-2]
    list_of_bits = [i+j for i, j in zip(trimmed_bits[::2], trimmed_bits[1::2])]
    reversed_bits = [list_of_bits[-i] for i in range(1,len(list_of_bits)+1)]
    return ''.join(reversed_bits)

Я объяснил это в обратном порядке, но вы хотите определить эту функцию, которую хотите применить к вашему столбцу, а затем использовать функцию apply (), чтобы это произошло.

...