Source code for idmd.manipulation.replace

"""Module for value replacement."""

import pandas as pd


[docs] class ReplaceLogic: """Handles the logic for replacing values in a DataFrame."""
[docs] @staticmethod def replace_values(df: pd.DataFrame, column: str, values_to_replace: str, replacement_method: str) -> pd.DataFrame: """ Replaces values in a specified column of the DataFrame. Args: df (pd.DataFrame): The DataFrame to modify. column (str): The column to modify. values_to_replace (str): The type of values to replace ("0", "np.nan", "outliers", "all"). replacement_method (str): The method to replace values ("median", "min", "max", "random", "np.nan"). Returns: pd.DataFrame: The modified DataFrame. """ col_data = df[column] if values_to_replace == "0": if replacement_method == "median": col_data = col_data.replace(0, col_data[col_data != 0].median()) elif replacement_method == "min": col_data = col_data.replace(0, col_data[col_data != 0].min()) elif replacement_method == "max": col_data = col_data.replace(0, col_data[col_data != 0].max()) elif replacement_method == "random": col_data = col_data.replace(0, col_data[col_data != 0].sample(n=1).values[0]) elif replacement_method == "np.nan": col_data = col_data.replace(0, pd.NA) elif values_to_replace == "np.nan": if replacement_method == "median": col_data = col_data.fillna(col_data.dropna().median()) elif replacement_method == "min": col_data = col_data.fillna(col_data.dropna().min()) elif replacement_method == "max": col_data = col_data.fillna(col_data.dropna().max()) elif replacement_method == "random": col_data = col_data.fillna(col_data.dropna().sample(n=1).values[0]) elif values_to_replace == "outliers": q1 = col_data.quantile(0.25) q3 = col_data.quantile(0.75) iqr = q3 - q1 lower = q1 - 1.5 * iqr upper = q3 + 1.5 * iqr outliers_mask = (col_data < lower) | (col_data > upper) if replacement_method == "median": col_data[outliers_mask] = col_data[~outliers_mask].median() elif replacement_method == "min": col_data[outliers_mask] = col_data[~outliers_mask].min() elif replacement_method == "max": col_data[outliers_mask] = col_data[~outliers_mask].max() elif replacement_method == "random": col_data[outliers_mask] = col_data[~outliers_mask].sample(n=1).values[0] elif replacement_method == "np.nan": col_data[outliers_mask] = pd.NA elif values_to_replace == "all": if replacement_method == "median": col_data = col_data.fillna(col_data.dropna().median()) elif replacement_method == "min": col_data = col_data.fillna(col_data.dropna().min()) elif replacement_method == "max": col_data = col_data.fillna(col_data.dropna().max()) elif replacement_method == "random": col_data = col_data.fillna(col_data.dropna().sample(n=1).values[0]) elif replacement_method == "np.nan": col_data = col_data.fillna(pd.NA) df[column] = col_data.astype(df[column].dtype, errors="ignore") return df