Closed3

pandas DataFrameの各カラムに対し、単一の式から異なる処理(=計算式)を呼び出すクラスの作成

shin_t_o_shin_t_o_
from enum import Enum

class DataCol1:
    @staticmethod
    def clean(sr:pd.Series):
        return sr+100

class DataCol2:
    @classmethod
    def clean(cls, sr:pd.Series):
        return sr*100

class DataCleansing(Enum):
    col_1 = DataCol1
    col_2 = DataCol2

    @classmethod
    def clean(cls, col:str, sr:pd.Series):
        for e in DataCleansing:
            if e.name == col:
                return e.value.clean(sr=sr)

        raise ValueError('{} is invalid column.'.format(col))

呼ぶ場合は

DataCleansing.clean(col='col_1', sr=_df['col_1'])
DataCleansing.clean(col='col_2', sr=_df['col_2'])
DataCleansing.clean(col='col_3', sr=_df['col_3'])
# ...
# -> for文、内包表記化が可能

Enum型の name=value 形式において、value箇所には処理(クラス)を指定することも可能。
親クラスで処理の分岐、子クラスにて各カラムに対する処理を書くという役割分担。

データクレンジングに於いて「読み込んだテーブルデータのカラム毎に別クレンジング処理を行いたい」などの場面に有用か。

shin_t_o_shin_t_o_

事例2

def calc_col1(sr):
    return sr + 100

def calc_col2(sr, num):
    return sr - 100 + num


class TestClass:
    clean = {
        'col_1': calc_col1,
        'col_2': calc_col2
    }

呼ぶ場合は

TestClass.clean['col_1'](sr=_df['col_1'])
TestClass.clean['col_2'](sr=_df['col_2'], num=10)
# ...
shin_t_o_shin_t_o_

事例3

def clean1(sr):
    return sr + 100

def clean2(sr):
    return sr - 100

def clean(col, sr):
    col_to_func = {
        "col1": clean1,
        "col2": clean2
    }
    return col_to_func[col](sr)

呼び方は同様。
呼び出し方がシンプルになるが引数を変えたい場合は少し煩雑になりそう。

このスクラップは2023/10/18にクローズされました