前提・実現したいこと
python で Dataframe に関する処理を実装しています。
既存のDataframeに何らかの評価を行い、
- 評価に使った列名(要素)
- 評価結果
を追加するような処理になります。
下記のように2通りの手法で実装できたのですが、どちらも無駄が多いように感じています。
- 実装1 (copy と concat)
- 実装2 (melt)
実装1は評価要素の数だけ複製を生成、実装2はwide型のDataframeを介して処理する必要がある。
より適切な手法があれば、ご教示おねがいします。
元データ
Python
1import pandas as pd 2 3df = pd.DataFrame({ 4 'name': ['Alice', 'Bob', 'Charlie'], 5 'param1': [10, 20, 30], 6 'param2': [40, 50, 60], 7 'param3': [60, 20, 60], 8}) 9 10# name param1 param2 param3 11# 0 Alice 10 40 60 12# 1 Bob 20 50 20 13# 2 Charlie 30 60 60 14
実装1
Python
1method_list = ['param1', 'param2', 'param3'] 2 3df_list = [] 4 5for method in method_list: 6 df_temp = df.copy() 7 df_temp['method'] = method 8 df_temp['judge'] = df_temp[method] > 50 9 df_list.append(df_temp) 10 11df_result1 = pd.concat(df_list) 12df_result1.reset_index(drop=True, inplace=True) 13 14 15 16# name param1 param2 param3 variable value 17# 0 Alice 10 40 60 param1 False 18# 1 Bob 20 50 20 param1 False 19# 2 Charlie 30 60 60 param1 False 20# 3 Alice 10 40 60 param2 False 21# 4 Bob 20 50 20 param2 False 22# 5 Charlie 30 60 60 param2 True 23# 6 Alice 10 40 60 param3 True 24# 7 Bob 20 50 20 param3 False 25# 8 Charlie 30 60 60 param3 True 26
実装2
Python
1df_temp = df.copy() 2 3col_dict = {'judge1': 'param1', 'judge2':'param2', 'judge3':'param3'} 4 5for k, v in col_dict.items(): 6 df_temp[k] = df_temp[v] > 50 7 8df_melt = df_temp.melt( 9 id_vars=['name', 'param1', 'param2', 'param3'], 10 value_vars=['judge1', 'judge2', 'judge3']) 11 12df_result2 = df_melt.replace(col_dict) 13
補足情報(FW/ツールのバージョンなど)
Google Colab にて確認
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/14 01:41