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.

Reemplace valores en una columna basado en condiciones (valor máximo) de múltiples columnas en pandas.

Tengo un conjunto de datos que ya he filtrado de esta manera:

En esta selección del dataframe, quiero reemplazar el valor de la columna “max” y “critical”, porque la columna “max” está equivocada, debería mostrar el valor máximo del contaminante en ese día (‘pm10’, ‘so2’, ‘co’, ‘o3’, ‘no2’) y la columna “critical” debería mostrar el nombre del contaminante máximo en ese día.

El resultado deseado es el siguiente:

tanggal stasiun                         pm10  so2   co  o3  no2 max   critical  categori
3515    2020-12-01  DKI1 (Bunderan HI)  22    17    4   19  8   22    PM10      BAIK
3516    2020-12-02  DKI1 (Bunderan HI)  25    18    4   28  7   28    o3        BAIK
3518    2020-12-04  DKI1 (Bunderan HI)  39    29    8   52  17  52    o3        SEDANG
3520    2020-12-06  DKI1 (Bunderan HI)  31    22    7   30  9   31    pm10      BAIK
3521    2020-12-07  DKI1 (Bunderan HI)  25    22    6   18  9   25    pm10      BAIK
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar el valor de las columnas “max” y “critical” en el dataframe seleccionado, podemos usar el método apply junto con una función lambda que calcule el valor máximo del contaminante y el nombre correspondiente del contaminante para cada fila.

    Aquí está el código para lograr el resultado deseado:

    # definir un diccionario para asignar nombres de contaminantes a sus columnas correspondientes
    contaminantes = {'pm10': 'pm10', 'so2': 'so2', 'co': 'co', 'o3': 'o3', 'no2': 'no2'}
    
    # definir una función para calcular el valor máximo del contaminante y su nombre para cada fila
    def calcular_maximo(fila):
        valores_contaminantes = [fila[contaminantes[p]] for p in contaminantes]
        valor_maximo = max(valores_contaminantes)
        contaminante_maximo = list(contaminantes.keys())[valores_contaminantes.index(valor_maximo)]
        return pd.Series({'max': valor_maximo, 'critical': contaminante_maximo})
    
    # aplicar la función al dataframe y asignar el resultado a dos nuevas columnas
    df[['max', 'critical']] = df.apply(lambda fila: calcular_maximo(fila), axis=1)
    
    # reemplazar los valores en la columna "max" con los valores máximos calculados del contaminante
    df['max'] = df.apply(lambda fila: fila[contaminantes[fila['critical']]], axis=1)
    
    # imprimir el dataframe resultante
    print(df)
    

    El dataframe resultante tendrá los valores deseados en las columnas “max” y “critical”:

          tanggal             stasiun  pm10  so2  co  o3  no2  max critical categoria
    3515 2020-12-01  DKI1 (Bunderan HI)    22   17   4  19    8   22     pm10     BAIK
    3516 2020-12-02  DKI1 (Bunderan HI)    25   18   4  28    7   28       o3     BAIK
    3518 2020-12-04  DKI1 (Bunderan HI)    39   29   8  52   17   52       o3   SEDANG
    3520 2020-12-06  DKI1 (Bunderan HI)    31   22   7  30    9   31     pm10     BAIK
    3521 2020-12-07  DKI1 (Bunderan HI)    25   22   6  18    9   25     pm10     BAIK
    

Comments are closed.