Как кодировать целочисленные маски как биты в фиктивные переменные в пандах

Я хотел бы кодировать целочисленные маски, хранящиеся в столбце данных pandas, в соответствующие двоичные функции, которые соответствуют битовым позициям в этих целых числах. Например, учитывая 4-битные целые числа и десятичное значение 11, я хотел бы получить 4 столбца со значениями 1, 0, 1, 1 и т. д. по всему столбцу.


person Wojciech Migda    schedule 20.03.2018    source источник
comment
Пожалуйста, предоставьте образец данных.   -  person YOLO    schedule 20.03.2018
comment
Пожалуйста, покажите часть своей работы и поделитесь с нами mcve, mcve2   -  person rpanai    schedule 20.03.2018


Ответы (1)


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

df = pd.DataFrame([list('{0:04b}'.format(x)) for x in df['col']], index=df.index).astype(int)

Спасибо, @pir за решение python 3.6+:

df = pd.DataFrame([list(f'{i:04b}') for i in df['col'].values], df.index)

Нумпи

Преобразование массива в DataFrame - решение из этого ответа, а также добавлено разделение значений подкачки на строки:

d = df['col'].values
m = 4
df = pd.DataFrame((((d[:,None] & (1 << np.arange(m)))) > 0)[:, ::-1].astype(int))
#alternative
#df = pd.DataFrame((((d[:,None] & (1 << np.arange(m-1,-1,-1)))) > 0).astype(int))

Or:

df = pd.DataFrame(np.unpackbits(d[:,None].astype(np.uint8), axis=1)[:,-m:])
person jezrael    schedule 20.03.2018
comment
Python 3.6+ вы можете использовать f-строки s = pd.Series(range(16)); pd.DataFrame([list(f'{i:04b}') for i in s.values], s.index) - person piRSquared; 20.03.2018
comment
Спасибо вам, ребята! Именно то, что я искал. - person Wojciech Migda; 20.03.2018