Python 如何用pandas中的条件替换两列?
我有一个熊猫数据框架,它包含产品、动作、数量和价格。如果行动是“销售”,我需要考虑产品的价格0,也要倒换数量。 我所尝试的: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({“产品”
将熊猫作为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})
使代码更容易理解。