基于Flag的Python DataFrame累加器

我有一个逻辑驱动的标志列,我需要创建一个列,当标志为真时增加 1,当标志为假时减少 1 到零下限。


我尝试了几种不同的方法,但无法让累加器“移位”来引用流程创建的新值。我知道下面的方法无论如何都不会止步于零,但我之前只是试图解决这个概念,这是解释目标的最切中要害的例子。我是否需要 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


一只甜甜圈
浏览 172回答 1
1回答

慕尼黑的夜晚无繁华

据我所知,没有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)dOutputOut:0    11    02    13    24    15    06    07    1dtype: int64accum  # shifted by one step forward compared with you exampleOut: 0    11   -12    13    14   -15   -16   -17    1dtype: int64但是可能有人知道pd.clip和/pd.cumsum或其他矢量化操作的合适组合。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python