繁体   English   中英

使用熊猫df具有多个ifs的lambda函数

[英]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'] < 0abs(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'] <= 0abs(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM