小编典典

根据递减值计算新值

python

问题:

我想做的是Series通过连续减少基础数字逐步减少a中的值。

我不知道的术语这个-我想我可以做的东西cumsumdiff,但我觉得我自己领先于白费力气有…

起始代码:

import pandas as pd

ALLOWANCE = 100
values = pd.Series([85, 10, 25, 30])

所需的输出:

desired = pd.Series([0, 0, 20, 30])

理由:

ALLOWANCE-的底数开始-中的每个值Series都减去余量,这是津贴额本身,因此发生以下步骤:

  • 从100开始,我们可以将85其完全删除,因此变为0,我们现在15保留为ALLOWANCE
  • 下一个值是10并且我们仍然15可用,因此它0再次变为并且我们已经5离开。
  • 下一个值是25-我们只剩5下了,所以变成了20现在,我们不再有任何余量。
  • 下一个值是30,并且由于没有余量,因此该值保持为30

阅读 171

收藏
2021-01-20

共1个答案

小编典典

继你最初的想法cumsumdiff,你可以写:

>>> (values.cumsum() - ALLOWANCE).clip_lower(0).diff().fillna(0)
0     0
1     0
2    20
3    30
dtype: float64

这是values减去津贴的累计总和。负值会被裁剪为零(因为我们在计算透支额之前才关心数字)。从那里,您可以计算出差异。

但是,如果第一个值可能大于容差,则首选以下两行变化:

s = (values.cumsum() - ALLOWANCE).clip_lower(0)
desired = s.diff().fillna(s)

这将NaN用“第一值-余量”值填充第一值。因此,在其中的情况下ALLOWANCE被降低到75时,它返回desired作为Series([10,10, 25, 30])

2021-01-20