根据递减值计算新值
问题:
我想做的是Series
通过连续减少基础数字逐步减少a中的值。
我不知道的术语这个-我想我可以做的东西cumsum
和diff
,但我觉得我自己领先于白费力气有…
起始代码:
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
。
-
继你最初的想法
cumsum
和diff
,你可以写:>>> (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])
。