问题:
我想做的是一步一步地将aSeries
中的值减去一个不断减少的基数。
我不确定这方面的术语-我确实认为我可以对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
。 最佳答案
按照你最初的想法,你可以写:
>>> (values.cumsum() - ALLOWANCE).clip_lower(0).diff().fillna(0)
0 0
1 0
2 20
3 30
dtype: float64
这是
cumsum
减去津贴的累积和。负值被剪裁为零(因为我们在透支限额之前不关心数字)。从那里,你可以计算出差额。但是,如果第一个值可能大于允许值,则首选以下两行变化:
s = (values.cumsum() - ALLOWANCE).clip_lower(0)
desired = s.diff().fillna(s)
这会将第一个
diff
值填充为“First value-allowance”值。因此,在values
降低到75的情况下,它返回NaN
为ALLOWANCE
。关于python - 根据递减值计算新值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28676916/