es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    df[['B11', 'B12', 'B13', 'B14', 'B15']] = df['decimal'].apply(lambda x: pd.Series(list(format(x, '05b'))))
    

    En el código anterior, utilizamos el método apply() de pandas para aplicar una función lambda a la columna decimal, que primero convierte el número decimal en una cadena que representa su equivalente binario utilizando la función format() con un especificador de formato de 05b para asegurarnos de que siempre haya cinco bits. Luego, convertimos esta cadena en una lista de caracteres individuales y creamos un pd.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.

Comments are closed.