pandasのapplyに与えるパラメータの扱い方
pandasを使っていて次のように集計したい場合があった。何をやっているかというと、PARAM1の列とPARAM3の列を足した値を新たな列PARAM1+PARAM3に追加している。
import pandas as pd
df = pd.DataFrame({
'TYPE': ['A', 'B', 'C', 'D', 'E'],
'DATE': ['2023/1/1', '2023/2/1', '2023/3/1', '2023/4/1', '2023/5/1'],
'PARAM1': [5000, 4000, 3000, 2000, 1000],
'PARAM2': [500, 400, 300, 200, 100],
'PARAM3': [50, 40, 30, 20, 10],
'PARAM4': [5, 4, 3, 2, 1],
})
df['PARAM1+PARAM3'] = df.apply(lambda x: x['PARAM1']+x['PARAM3'], axis=1)
df
実行結果は以下の通り。
さて、ここで抽出する列をパラメータにして自由に列を集計できるようにする場合はどうやって上記を変更すれば良いのだろうか?
いろいろと悩んだあげく、次のように「式を文字列で出力してevalする」という方法を取ることで一応やりたいことは実現できた。
import pandas as pd
df = pd.DataFrame({
'TYPE': ['A', 'B', 'C', 'D', 'E'],
'DATE': ['2023/1/1', '2023/2/1', '2023/3/1', '2023/4/1', '2023/5/1'],
'PARAM1': [5000, 4000, 3000, 2000, 1000],
'PARAM2': [500, 400, 300, 200, 100],
'PARAM3': [50, 40, 30, 20, 10],
'PARAM4': [5, 4, 3, 2, 1],
})
params = ['PARAM1', 'PARAM3']
formula = '+'.join(f"x["{n}"]" for n in params)
key = '+'.join(params)
df[key] = df.apply(lambda x: eval(formula), axis=1)
df
実行結果は以下の通り
しかし、どうもこんな書き方をするのは成功法ではない気がしてならない。
なにかうまい書き方があるのだろうか。これはpandasのqueryを書く場合も同じような境遇に陥る。
# ああ、前回の記事から8ヶ月経っている…。
この記事が気に入ったらサポートをしてみませんか?