[英]lambda function with multiple ifs using pandas df
我有一个简单的df,其中包含收入和成本数据。 在我的情况下,成本可能为负。
我想按以下方式计算收入与成本的比率:
if ((x['cost'] < 0) & (x['rev'] >=0 )):
x['r_c_ratio'] = (x['rev'] + abs(x['cost'])) / abs(x['cost'])
elif((x['cost'] > 0) & (x['rev'] <=0 )):
x['r_c_ratio'] = (x['cost'] + abs(x['rev'])) / x['cost']
else:
x['r_c_ratio'] = x['rev'] / x['cost']
如何在lambda函数中实现这一点?
df['revenue_cost_ratio'] = df.apply(lambda x:....
根据此链接 ,lambda语法为:
lambda x: True if x % 2 == 0 else False
这仅允许其他条件。
熊猫矢量
r = x.rev.div(x.cost)
r.abs().add(r < 0).rename('revenue_cost_ratio')
numpy矢量化
顺便说一句,我会用这个
r = x.rev.values / x.cost.values
pd.Series(np.abs(r) + (r < 0), x.index, name='revenue_cost_ratio')
如果您坚持使用lambda
f = lambda x: (x.rev * x.cost < 0) + abs(x.rev / x.cost)
x['revenue_cost_ratio'] = x.apply(f)
让我们看看你的3种情况
情况1
if ((x['cost'] < 0) & (x['rev'] >=0 )):
x['r_c_ratio'] = (x['rev'] + abs(x['cost'])) / abs(x['cost'])
当x['cost'] < 0
, abs(x['cost'])
仅为-1 * x['cost']
因此可以简化为
(x['rev'] - x['cost']) / -x['cost']
要么
(x['cost'] - x['rev']) / x['cost']
情况二
elif((x['cost'] > 0) & (x['rev'] <=0 )):
x['r_c_ratio'] = (x['cost'] + abs(x['rev'])) / x['cost']
当x['rev'] <= 0
, abs(x['rev'])
仅为-1 * x['rev']
因此可以简化为
(x['cost'] - x['rev']) / x['cost']
哇,这与案例一相同! 但是我们可以进一步减少到
1 - x['rev'] / x['cost']
以及何时使用它? 仅当x['rev']
或x['cost']
均为负数而不是两者均为负数时才出现。 好吧,只有在该比率为负时才会发生。
情况3
x['rev'] / x['cost']
再次! 真幸运! 看起来很像1 - x['rev'] / x['cost']
因此,如果我们预先计算x['rev'] / x['cost']
,对它进行负性测试,然后将其返回或减去1,就可以了。 因此,功能在一开始。
不要使用套用。 它非常慢。 使用嵌套的位置。
np.where((x['cost'] < 0) & (x['rev'] >=0 ), (x['rev'] + abs(x['cost'])) / abs(x['cost']),
np.where((x['cost'] > 0) & (x['rev'] <=0 ), (x['cost'] + abs(x['rev'])) / x['cost'],
x['rev'] / x['cost']))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.