Reemplace los valores negativos con el último valor positivo anterior en Pandas DataFrame

En este artículo, discutiremos cómo reemplazar el valor negativo en la columna Pandas DataFrame con el último valor positivo anterior.

Al hacer esto, pueden surgir dos situaciones: 

  • El valor permanece sin modificar si no existe ningún valor positivo anterior
  • Actualización del valor a 0 si no existe ningún valor positivo en curso

Vamos a discutir estos casos en detalle.

Caso 1: el valor permanece sin modificar si no existe un valor positivo en curso

Se declara una variable para almacenar el último valor positivo anterior inicializado con algún entero negativo grande. A continuación, se realiza una iteración del marco de datos por columnas. 

  • En caso de que el valor sea negativo, se reemplaza con la variable de valor anterior positivo, si existe, de lo contrario, permanece sin modificar.
  • Y, en caso de que el valor sea positivo, se actualiza la variable anterior de valor positivo.

Ejemplo:

Python3

import pandas as pd
  
  
# creating a pandas dataframe
df = pd.DataFrame([[8, -2, 0, 3, 51, 2],
                   [6, -2, -5, -7, 0, -1],
                   [-1, -12, -5, 4, 5, 3]])
print("Original DataFrame : \n")
print(df)
  
# declaring a pre defined value
prec_val = -999
  
# iterate over columns
for i in range(df.shape[1]):
  
    # resetting value over each column
    prec_val = -999
  
    # iterate over rows
    for j in range(df.shape[0]):
  
        # accessing the cell value
        cell = df.at[j, i]
  
        # check if cell value is negative
        if(cell < 0):
  
            # check if prec_val is not default
            # set value
            if(prec_val != -999):
  
                # replace the cell value
                df.at[j, i] = prec_val
        else:
  
            # store the latest value in variable
            prec_val = df.at[j, i]
  
print("Modified DataFrame : ")
print(df)

Producción:

Caso 2: actualización del valor a 0 si no existe ningún valor positivo en curso

Este enfoque utiliza el concepto de enmascaramiento de marcos de datos para reemplazar los valores negativos del marco de datos. Los valores se recorren de izquierda a derecha en forma de columna, de arriba a abajo. En este enfoque, inicialmente, todos los valores < 0 en las celdas del marco de datos se convierten a NaN. 

El método dataframe.ffill() de Pandas se utiliza para completar los valores faltantes en el marco de datos. ‘fill’ en este método significa ‘forward fill’ y propaga la última observación válida encontrada hacia adelante. La función ffill() se usa para completar los valores que faltan a lo largo del eje de índice que se especifica. Este método tiene la siguiente sintaxis: 

Sintaxis: DataFrame.ffill(eje=Ninguno, en el lugar=Falso)

Parámetros: 

  • eje – {0, índice 1, columna}
  • inplace : si es verdadero, complete el lugar.

A esto le sigue el método fillna() para llenar los valores NA/NaN usando el valor especificado. Aquí, llenamos los valores de NaN con 0, ya que es el valor entero positivo más bajo posible. Todos los valores negativos se convierten así en valores positivos. Este enfoque puede funcionar en marcos de datos que no tienen ningún valor de string almacenado. En caso de que no haya valores positivos anteriores, el valor negativo se reemplaza por 0. 

Python3

import pandas as pd
  
# creating a pandas dataframe
data_frame = pd.DataFrame({'col1': [8, -2, 0, 3, 51, 2],
                           'col2': [-1, -2, -5, -7, 0, -1],
                           'col3': [-1, -12, -5, 4, 5, 3]})
  
print("Original DataFrame")
print(data_frame)
  
# masking the data frame
data_frame = data_frame.mask(data_frame.lt(
    0)).ffill().fillna(0).astype('int32')
  
print("Modified DataFrame")
print(data_frame)

Producción:

Publicación traducida automáticamente

Artículo escrito por codersgram9 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *