我有一个逻辑驱动的标志列,我需要创建一个列,当标志为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
答案 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.clip
和pd.cumsum
或其他矢量化操作的合适组合。