2017-09-18 5 views
0
私は以下のデータフレームで働いています

、と呼ばれるdf_atr_check:新しいデータフレームの列に基づいて、if文や他の列

Symbol Average Price ATR Quantity 
SBUX   56   2  100 
AAPL   150   3  -200 
GOOG   700   4  300 

私は名前を「メンタル停止」と私のデータフレームに新しい列を作成しようとしています。

条件は非常に単純です:数量が> 0の場合、メンタルストップ値は「平均価格」 - 「ATR」、それ以外の場合は「平均価格」+「ATR」になります。

ここではラムダ関数を使用しようとしていますが、値は返されません。私が間違っていることを教えてください。

df_atr_check["Mental Stop"] = lambda x: (df_atr_check["Average Price"] - df_atr_check["ATR Multiple"]) if df_atr_check["Quantity"] > 0 else (df_atr_check["Average Price"] + df_atr_check["ATR Multiple"]) 

おかげで、

+0

...これを試してみてください。 df_atr_check ["ATR Multiple"] Trueは1に強制され、Falseになります(例:df_atr_check ["Mental Stop"] = df_atr_check ["Average Price"] +(1-2 *(df_atr_check ["Quantity"]> 0) (1-2 *(df_atr_check ["Quantity"]> 0)は、quantity> 0の場合は-1、quantity <= 0の場合は1と評価されます。 – Acccumulation

答えて

0

は、私はそれを考え出しました。

愚かな私。とにかく、ありがとう!

df_atr_check["Mental Stop"] = df_atr_check.transform(lambda x: (x["Average Price"] - x["ATR Multiple"]) \ 
    if x["Quantity"] > 0 else (x["Average Price"] + x["ATR Multiple"]), axis=1) 
1

リストの補完は、if条件があまりにも複雑にならない限り、このような状況に最適です。 Lamdasは同じ目的を達成しますが、リスト内包表記は読みやすくなります(私の意見では)。

はあなただけでその機能を取得したい場合は、ラムダせずにそれを行うことができます

df_atr_check['Mental Stop'] = [x - y if z > 0 else x + y for x,y,z in zip(df_atr_check['Average Price'], df_atr_check['ATR Multiple'], df_atr_check['Quantity'])] 
関連する問題