通过熊猫中的列值触发结果

时间:2018-08-22 21:06:18

标签: python pandas

让我们考虑一个数字帧,其数字分布在-1和1之间。在此序列中,有两个边界会更改系统状态:-0.5和0.5。如果系统越过0.5,它将保持其位置,直到系统通过-0.5(和对面)为止。在以下数据框中给出了一个直观的示例:

d = pd.DataFrame([[0.1,0.3,-0.1,-0.8,-0.7,0.2,0.9,0.4,-0.1,-0.8], [None, None, None, -1,-1,-1, 1, 1, 1, -1]]).T

如何在不使用for循环的情况下计算 1

enter image description here

1 个答案:

答案 0 :(得分:3)

首先,设置您的条件:

c1 = (df[0].lt(-0.5) & df[0].shift().gt(-0.5)) | (df[0].gt(-0.5) & df[0].shift().lt(-0.5))
c2 = (df[0].lt(0.5) & df[0].shift().gt(0.5)) | (df[0].gt(0.5) & df[0].shift().lt(0.5))

然后使用np.selectffill

df.assign(out=np.select([c1, c2], [-1, 1], np.nan)).ffill()

     0  out
0  0.1  NaN
1  0.3  NaN
2 -0.1  NaN
3 -0.8 -1.0
4 -0.7 -1.0
5  0.2 -1.0
6  0.9  1.0
7  0.4  1.0
8 -0.1  1.0
9 -0.8 -1.0

此方法不能处理的一件事是,如果两个阈值都在一个步骤中都超过,该怎么办。例如,如果您从-0.60.8,这将默认为第一个条件。您可能需要根据需要调整条件,但这会帮助您入门。