Python 基于if语句和其他列的新Dataframe列

Python 基于if语句和其他列的新Dataframe列,python,lambda,Python,Lambda,我正在使用以下数据帧,称为df_atr_check: Symbol Average Price ATR Quantity SBUX 56 2 100 AAPL 150 3 -200 GOOG 700 4 300 我试图在我的数据框中创建一个名为“Mental Stop”的新列 条件非常简单: 如果数量大于0,则心理停止值将为“平均价格”-“ATR”,否

我正在使用以下数据帧,称为df_atr_check:

Symbol  Average Price   ATR Quantity
SBUX          56          2       100
AAPL         150          3      -200
GOOG         700          4       300
我试图在我的数据框中创建一个名为“Mental Stop”的新列

条件非常简单: 如果数量大于0,则心理停止值将为“平均价格”-“ATR”,否则将为“平均价格”+“ATR”

我试图在这里使用Lambda函数,但是,它不会为我返回值。请让我知道我做错了什么

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"])
谢谢,

我想出来了

我真傻。无论如何谢谢你

    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)

如果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'])]

如果您只想获得该功能,则可以不使用lambda。例如:df_atr_check[“心理停止”]=df_atr_check[“平均价格”]+(1-2*(df_atr_check[“数量”]>0))*df_atr_check[“atr倍数”]True强制为1,False强制为0,因此(1-2*(df_atr_check[“数量”]>0)在数量大于0时计算为-1,在数量大于0时计算为1