Dividir un decimal en múltiples columnas binarias en un marco de datos
El marco de datos tiene una columna llamada ‘decimal’, necesito convertir decimal en columnas binarias específicas.
Ejemplo:
3 (Decimal) -> 0000000000000011 (Binario)
Código:
df
| datetime | mc | vol | decimal |
|-------------------------|----|-----|---------|
| 2021-11-20 12:04:55.107 | PR | 50 | 1 |
| 2021-11-20 12:04:56.187 | PR | 50 | 1 |
| 2021-11-20 12:04:57.200 | PR | 50 | 3 |
| 2021-11-20 12:04:58.310 | PR | 50 | 3 |
| 2021-11-20 12:04:59.467 | PR | 50 | 5 |
| 2021-11-20 12:05:00.500 | PR | 50 | 5 |
Paso 1: Con el código obtuve la siguiente tabla binaria. Binario (0 ~ 15)
df_test['binary'] = df.decimal.apply(lambda x: format(int(x), '016b'))
| datetime | mc | vol | binary |
|-------------------------|----|-----|------------------|
| 2021-11-20 12:04:55.107 | PR | 50 | 0000000000000001 |
| 2021-11-20 12:04:56.187 | PR | 50 | 0000000000000001 |
| 2021-11-20 12:04:57.200 | PR | 50 | 0000000000000011 |
| 2021-11-20 12:04:58.310 | PR | 50 | 0000000000000011 |
| 2021-11-20 12:04:59.467 | PR | 50 | 0000000000000101 |
| 2021-11-20 12:05:00.500 | PR | 50 | 0000000000000101 |
Paso 2: Seleccionar valor y crear una nueva columna
df['B15'] = df['binary'].str[15]
df['B14'] = df['binary'].str[14]
df['B13'] = df['binary'].str[13]
df['B12'] = df['binary'].str[12]
df['B11'] = df['binary'].str[11]
Requisito:
| datetime | mc | vol | B11 | B12 | B13 | B14 | B15 |
|-------------------------|----|-----|-----|-----|-----|-----|------|
| 2021-11-20 12:04:55.107 | PR | 50 | 0 | 0 | 0 | 0 | 1 |
| 2021-11-20 12:04:56.187 | PR | 50 | 0 | 0 | 0 | 0 | 1 |
| 2021-11-20 12:04:57.200 | PR | 50 | 0 | 0 | 0 | 1 | 1 |
| 2021-11-20 12:04:58.310 | PR | 50 | 0 | 0 | 0 | 1 | 1 |
| 2021-11-20 12:04:59.467 | PR | 50 | 0 | 0 | 1 | 0 | 1 |
| 2021-11-20 12:05:00.500 | PR | 50 | 0 | 0 | 1 | 0 | 1 |
¿Existe algún otro método más eficiente?
davy.ai
Sí, hay otro método eficiente para convertir la columna decimal en columnas binarias específicas sin necesidad de crear una columna binaria intermedia. Puede utilizar el método
apply()
incorporado de pandas con una función lambda de la siguiente manera:En el código anterior, utilizamos el método
apply()
de pandas para aplicar una función lambda a la columnadecimal
, que primero convierte el número decimal en una cadena que representa su equivalente binario utilizando la funciónformat()
con un especificador de formato de05b
para asegurarnos de que siempre haya cinco bits. Luego, convertimos esta cadena en una lista de caracteres individuales y creamos unpd.Series
a partir de ella. Finalmente, utilizamos la indexación[['B11', 'B12', 'B13', 'B14', 'B15']]
para asignar esta serie a nuevas columnas binarias con los nombres especificados.Este método es más eficiente porque evita la necesidad de crear una columna binaria intermedia y recorrer cada fila varias veces, lo cual puede ralentizar el código al trabajar con conjuntos de datos grandes.