基于标志的Python DataFrame累加器

时间:2018-12-28 14:12:43

标签: python pandas

我有一个逻辑驱动的标志列,我需要创建一个列,当标志为true时该列递增1,而当该标志为false时递减1递减至下限0。

我尝试了几种不同的方法,但无法使累加器“移位”引用该过程创建的新值。我知道下面的方法无论如何都不会停止为零,但是我只是想尝试之前的概念,这是解释目标的最关键的例子。我需要for循环逐行迭代吗?

df = pd.DataFrame(data=np.random.randint(2,size=10), columns=['flag'])
df['accum'] = 0
df['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 output
df

Output

1 个答案:

答案 0 :(得分:0)

据我所知,没有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.clippd.cumsum或其他矢量化操作的合适组合。