我有兴趣提取列值累计上升至少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
signs
1 1
6 -1
10 1
12 1
15 -1
Name: up_or_down, dtype: int64
pd.concat([df_slcd, signs], axis=1)