我想实现这种“阈值穿越”逻辑(由于缺乏更好的用语):
num
开始,并将列switch
设置为1。num
跌至(或超过)某个lower_bound
时,请将switch
设为0。switch
保持为0,直到num
达到(或超过)upper_bound
,然后switch
会回到1。为说明起见,这是lower_bound
3和upper_bound
6的设置。
df = pd.DataFrame([6, 5, 3, 2, 4, 5, 6, 3, 7, 5], columns=['num'])
df['switch'] = 1
这是我想要的输出。
num switch
0 6 1
1 5 1
2 3 0
3 2 0
4 4 0
5 5 0
6 6 1
7 3 0
8 7 1
9 5 1
当然可以轻松地进行迭代,但是我正在寻找关于矢量化(numpy / pandas)方法的一些想法。谢谢。
答案 0 :(得分:4)
我认为您可以做到
s=df.num.ge(6).astype(int)-df.num.le(3).astype(int)
s.mask(s==0).ffill().replace(-1,0).fillna(1)
0 1.0
1 1.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 0.0
8 1.0
9 1.0
Name: num, dtype: float64
答案 1 :(得分:1)
这是一种基于numpy
的方法,虽然有点冗长,但应该相当有效。
a = df.num
lw, up = 3, 6
pd.Series(
np.select([a.le(lw), a.ge(up)], [-1, 1], np.nan)
).ffill().clip(0, 1).fillna(1)
0 1.0
1 1.0
2 0.0
3 0.0
4 0.0
5 0.0
6 1.0
7 0.0
8 1.0
9 1.0
dtype: float64