Closed3
pandas DataFrameの各カラムに対し、単一の式から異なる処理(=計算式)を呼び出すクラスの作成
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箇所には処理(クラス)を指定することも可能。
親クラスで処理の分岐、子クラスにて各カラムに対する処理を書くという役割分担。
データクレンジングに於いて「読み込んだテーブルデータのカラム毎に別クレンジング処理を行いたい」などの場面に有用か。
事例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)
# ...
事例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にクローズされました