我有兴趣提取列值累计上升至少5或累计下降至少5的行,然后获取这些累积变化的迹象,up_or_down
例如,假设我想将此应用于下面的列y

df = pd.DataFrame({'x': range(16), 'y': [1,10,14,12,13,9,4,2,6,7,10,11,16,17,14,11]})

它应该产生:
x   y        # up_or_down
1   10       # +1
6   4        # -1
10  10       # +1
12  16       # +1
15  11       # -1

我的数据帧非常大,所以我希望有一种很好的矢量化方法来使用pandas的api,而不是使用iterrows()循环它。

最佳答案

这是解决方案的核心

def big_diff(y):
    val = y.values
    r = val[0]
    for i, x in enumerate(val):
        d = r - x
        if abs(d) >= 5:
            yield i, 1 if d < 0 else -1
            r = x

然后你可以做这样的事
slc = np.array(list(big_diff(df.y)))
df_slcd = pd.DataFrame(df.values[slc[:, 0]], df.index[slc[:, 0]], df.columns)
signs = pd.Series(slc[:, 1], df.index[slc[:, 0]], name='up_or_down')

df_slcd

python -  Pandas :仅将累积变化的每一行都保留一个阈值?-LMLPHP
signs

1     1
6    -1
10    1
12    1
15   -1
Name: up_or_down, dtype: int64

pd.concat([df_slcd, signs], axis=1)

python -  Pandas :仅将累积变化的每一行都保留一个阈值?-LMLPHP

10-02 03:54