Python 如何用pandas中的条件替换两列?

Python 如何用pandas中的条件替换两列?,python,python-3.x,pandas,lambda,Python,Python 3.x,Pandas,Lambda,我有一个熊猫数据框架,它包含产品、动作、数量和价格。如果行动是“销售”,我需要考虑产品的价格0,也要倒换数量。 我所尝试的: 将熊猫作为pd导入 def my_功能(df): kwargs={ “数量”:λx:-x[“数量”]如果str中的“销售”(x[“行动”]),否则x[“数量”], “价格(美元)”:lambda x:0如果str中的“卖出”(x[“动作”]),否则x[“价格(美元)”, } 返回df.assign(**kwargs) input_df=pd.DataFrame({“产品”

我有一个熊猫数据框架,它包含产品、动作、数量和价格。如果行动是“销售”,我需要考虑产品的价格0,也要倒换数量。

我所尝试的:

将熊猫作为pd导入
def my_功能(df):
kwargs={
“数量”:λx:-x[“数量”]如果str中的“销售”(x[“行动”]),否则x[“数量”],
“价格(美元)”:lambda x:0如果str中的“卖出”(x[“动作”]),否则x[“价格(美元)”,
}
返回df.assign(**kwargs)
input_df=pd.DataFrame({“产品”:[“苹果”、“苹果”、“香蕉”],
“行动”:[“出售”、“购买”、“出售”],
“数量”:[1,2,3],
“价格(美元)”:[3,5,8],
})
结果_df=我的函数(输入_df)
预期的_df=pd.DataFrame({“产品”:[“苹果”、“苹果”、“香蕉”],
“行动”:[“出售”、“购买”、“出售”],
“数量”:[-1,2,-3],
“价格(美元)”:[0,5,0],
})
不知何故,lambda表达式中的条件总是返回True,我也认为这可能是一种更简单的方法。有什么想法吗?

我们可以

s=input_df.action.str.contains('SELL')
input_df.quantity*=s.map({True:-1,False:1})
input_df["price (usd)"]*=~s
input_df
  product    action  quantity  price (usd)
0   APPLE    SELL          -1            0
1   APPLE     BUY           2            5
2  BANANA    SELL          -3            0
在功能上

def my(x):
...     s=x.action.str.contains('SELL')
...     x.quantity*=s.map({True:-1,False:1})
...     x["price (usd)"]*=~s
...     return (x)


out=my(input_df)
out
  product    action  quantity  price (usd)
0   APPLE    SELL          -1            0
1   APPLE     BUY           2            5
2  BANANA    SELL          -3            0

下面的代码修复了它。我得到了期望的输出

def my_function(df):
    kwargs = {
        "quantity": df.apply(lambda x: -x["quantity"] if "SELL" in str(x["action"]) else x["quantity"], axis = 1),
        "price (usd)": df.apply(lambda x: 0 if "SELL" in str(x["action"]) else x["price (usd)"], axis = 1),
    }
    return df.assign(**kwargs)

很好,很有效。为了便于阅读,我使用axis=“columns”而不是axis=1。谢谢你,拉明。这当然可以被认为是一个答案,但我认为使用尤本的程序更容易理解。@staticdev你没有要求其他程序。您请求代码方面的帮助。我帮你写了代码。关于“更容易理解”的问题,我不确定他的代码比你的代码更容易阅读。在卖掉他的代码后,可读性是我关心的问题。事实上,我认为你的代码比他的更容易理解。我也会使用
x[“price(usd)”]*=sells.map({True:0,False:1})
使代码更容易理解。