numpy /熊猫矢量化的“阈值穿越”逻辑

时间:2019-06-06 01:47:21

标签: python pandas numpy vectorization

我想实现这种“阈值穿越”逻辑(由于缺乏更好的用语):

  • 从列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)方法的一些想法。谢谢。

2 个答案:

答案 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