为了账号安全,请及时绑定邮箱和手机立即绑定

基于Flag的Python DataFrame累加器

基于Flag的Python DataFrame累加器

一只甜甜圈 2021-09-28 13:25:52
我有一个逻辑驱动的标志列,我需要创建一个列,当标志为真时增加 1,当标志为假时减少 1 到零下限。我尝试了几种不同的方法,但无法让累加器“移位”来引用流程创建的新值。我知道下面的方法无论如何都不会止步于零,但我之前只是试图解决这个概念,这是解释目标的最切中要害的例子。我是否需要 for 循环来逐行迭代?df = pd.DataFrame(data=np.random.randint(2,size=10), columns=['flag'])df['accum'] = 0df['accum'] = np.where(df['flag'] == 1, df['accum'].shift(1) + 1, df['accum'].shift(1) - 1)df['dOutput'] = [1,0,1,2,1,2,3,2,1,0] #desired outputdf
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

据我所知,没有numpy或熊猫矢量化操作可以做到这一点,因此,您应该逐行迭代:


def cumsum_with_floor(series):

    acc = 0

    output = []

    accum_list = []

    for val in series:

        val = 1 if val else -1

        acc += val

        accum_list.append(val)

        acc = acc if acc > 0 else 0

        output.append(acc)

    return pd.Series(output, index=series.index), pd.Series(accum_list, index=series.index)


series = pd.Series([1,0,1,1,0,0,0,1])

dOutput, accum = cumsum_with_floor(series)


dOutput

Out:

0    1

1    0

2    1

3    2

4    1

5    0

6    0

7    1

dtype: int64


accum  # shifted by one step forward compared with you example

Out: 

0    1

1   -1

2    1

3    1

4   -1

5   -1

6   -1

7    1

dtype: int64

但是可能有人知道pd.clip和/pd.cumsum或其他矢量化操作的合适组合。


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信