根据递减值计算新值

发布于 2021-01-29 14:58:47

问题:

我想做的是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
关注者
0
被浏览
85
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    继你最初的想法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])



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看