以下のようなデータフレームがあります。
import pandas as pd
import numpy as np
raw_data = {'student':['A','B','C','D','E'],
'score': [100, 96, 80, 105,156],
'height': [7, 4,9,5,3],
'trigger1' : [84,95,15,78,16],
'trigger2' : [99,110,30,93,31],
'trigger3' : [114,125,45,108,46]}
df2 = pd.DataFrame(raw_data, columns = ['student','score', 'height','trigger1','trigger2','trigger3'])
print(df2)
複数の条件に基づいてフラグ列を導出する必要があります。
スコアと高さの列をトリガー1〜3列と比較する必要があります。
フラグ列:
スコアが等しいトリガー1より大きく、高さが8より小さい場合、赤-
トリガー2以上で高さが8未満の場合、黄色-
スコアがトリガー3以上で高さが8未満の場合、オレンジ-
高さが8より大きい場合は空白のままにします
pandasデータフレームにelse条件があり、列を導出する場合、どのように記述しますか?
期待される出力
student score height trigger1 trigger2 trigger3 Flag
0 A 100 7 84 99 114 Yellow
1 B 96 4 95 110 125 Red
2 C 80 9 15 30 45 NaN
3 D 105 5 78 93 108 Yellow
4 E 156 3 16 31 46 Orange
私の元の質問の他の列Text1について、私はこれを疲れましたが、astype(str)を使用して連結するときにinterger列は文字列を変換しませんか?
def text_df(df):
if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger1'].astype(str) + " and less than height 5"
Elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger2'].astype(str) + " and less than height 5"
Elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger3'].astype(str) + " and less than height 5"
Elif (df['height'] > 8):
return np.nan
上限と下限を使用した連鎖比較が必要です
def flag_df(df):
if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
return 'Red'
Elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
return 'Yellow'
Elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
return 'Orange'
Elif (df['height'] > 8):
return np.nan
df2['Flag'] = df2.apply(flag_df, axis = 1)
student score height trigger1 trigger2 trigger3 Flag
0 A 100 7 84 99 114 Yellow
1 B 96 4 95 110 125 Red
2 C 80 9 15 30 45 NaN
3 D 105 5 78 93 108 Yellow
4 E 156 3 16 31 46 Orange
注:非常にネストされたnp.whereでこれを行うことができますが、複数のif-elseに関数を適用することを好みます
次のように、軸1のカスタム関数にも適用できます。
def color_selector(x):
if (x['trigger1'] <= x['score'] < x['trigger2']) and (x['height'] < 8):
return 'Red'
Elif (x['trigger2'] <= x['score'] < x['trigger3']) and (x['height'] < 8):
return 'Yellow'
Elif (x['trigger3'] <= x['score']) and (x['height'] < 8):
return 'Orange'
Elif (x['height'] > 8):
return ''
df2 = df2.assign(flag=df2.apply(color_selector, axis=1))