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.

¿Cómo se cambia el formato de un dataframe de pandas a otro formato?

El dataframe dado se ve así:

                     sensorA  sensorB  deviceA  deviceB  inputA  inputB  machineA  machineB  flagA  flagB  mainA
Time
2021-11-26 20:20:00    379.0      0.0      0.0    489.0    0.77    35.0       0.0      51.0  -13.0  230.0    1.6
2021-11-26 20:30:00    344.0      0.0      0.0    143.0    0.76    31.0       0.0      50.0  -11.0  230.0    1.8

Quiero mapear esto al siguiente formato, separando las columnas individuales en una combinación de Campo y atributo:

|Time                 | Tipo   | atributo | Valor   |
|---------------------|--------|-----|---------|
|2021-11-26 20:20:00  | sensor | a   | 999     |

He intentado varias estrategias como el uso de índices múltiples, groupby, etc., pero no logro encontrar exactamente cómo implementarlo.

¡Cualquier ayuda sería apreciada!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mapear el dataframe dado al formato deseado, podemos utilizar la función melt de Pandas para transformar el dataframe de formato ancho a largo. Luego podemos separar los nombres de columna existentes en campo y atributo, y renombrar las columnas en consecuencia.

    import pandas as pd
    
    # Crear un dataframe de ejemplo
    df = pd.DataFrame({
        'Time': ['2021-11-26 20:20:00', '2021-11-26 20:30:00'],
        'sensorA': [379.0, 344.0],
        'sensorB': [0.0, 0.0],
        'deviceA': [0.0, 0.0],
        'deviceB': [489.0, 143.0],
        'inputA': [0.77, 0.76],
        'inputB': [35.0, 31.0],
        'machineA': [0.0, 0.0],
        'machineB': [51.0, 50.0],
        'flagA': [-13.0, -11.0],
        'flagB': [230.0, 230.0],
        'mainA': [1.6, 1.8]
    })
    
    # Utilizar melt para transformar el dataframe de formato ancho a largo
    df = pd.melt(df, id_vars=['Time'], var_name='Field')
    
    # Separar la columna Field en atributo y campo
    df[['attribute', 'field']] = df['Field'].str.extract(r'(\D)(\D*)')
    
    # Renombrar las columnas en consecuencia y seleccionar las columnas requeridas
    df = df.rename(columns={'value': 'Value', 'Field': 'Type'})[['Time', 'Type', 'attribute', 'Value']]
    
    # Filtrar las filas con valores de atributo nulos
    df = df[df['attribute'].notnull()]
    
    print(df.head())
    
    # Output:
    #                   Time    Type attribute  Value
    # 0  2021-11-26 20:20:00  sensor         A  379.0
    # 1  2021-11-26 20:30:00  sensor         A  344.0
    # 2  2021-11-26 20:20:00  sensor         B    0.0
    # 3  2021-11-26 20:30:00  sensor         B    0.0
    # 4  2021-11-26 20:20:00  device         A    0.0
    

    Este código transformará el dataframe dado al formato deseado con cuatro columnas: Time, Type, attribute y Value. La columna Type representa los nombres de columna originales del dataframe, los cuales hemos separado en las columnas field y attribute. La columna attribute representa las letras en los nombres de columna originales, y la columna field representa los caracteres restantes.

    Podemos filtrar las filas con valores de atributo nulos ya que solo nos interesan las columnas que contienen letras.

Comments are closed.