新数据帧取决于Python中先前行的多个条件

时间:2017-07-14 17:32:58

标签: python pandas

我有一个包含a和b列的数据框,如下所示:

                 a       b
date                      
2017-06-05  1.1285  1.1110
2017-06-06  1.1285  1.1165
2017-06-07  1.1285  1.1202
2017-06-08  1.1285  1.1195
2017-06-09  1.1285  1.1166
2017-06-12  1.1285  1.1166
2017-06-13  1.1285  1.1166
**2017-06-14  1.1296  1.1166**
2017-06-15  1.1296  1.1167
2017-06-16  1.1296  1.1170
**2017-06-19  1.1296  1.1132**
2017-06-20  1.1296  1.1119
2017-06-21  1.1296  1.1119
2017-06-22  1.1296  1.1119
2017-06-23  1.1296  1.1119
2017-06-26  1.1296  1.1119
2017-06-27  1.1349  1.1128
2017-06-28  1.1391  1.1139
2017-06-29  1.1445  1.1145
2017-06-30  1.1445  1.1172

我想根据以下条件为行生成一个新的c值,返回值为1:

condition 1: df['a'] > df['a'].shift(1) #i.e. an increase of value of a; OR
condition 2: df['b'] >= df['b'].shift(1) #i.e. value of b stays the same or increases after condition 1 happens. 

在上面的示例中,这意味着我希望列c在2017-06-14上显示值1(因为该行的值增加)并且在2017-06-之前保持显示值1 19(因为b的值在该行减少,2017-06-14和2017-06-16之间的列c应该显示值1,因为b的值在2017年6月14日的列a增加之后没有减少

我花了很多时间在np.where()函数上,但似乎不容易实现上面的逻辑,因为逻辑本身也取决于逻辑的结果。

感谢任何答案。

--------------- ADD ON -------------------------- 回应约翰的后续问题。让我用更清晰的输入和预期的答案重写这个例子(请忽略上面的数据集):

date a.diff b.diff c
0 2017-06-05 0.0 0.0 0 1 2017-06-06 0.0 1.0 0 2 2017-06-07 0.0 1.0 0 3 2017-06-08 0.0 -1.0 0 4 2017-06-09 0.0 -1.0 0 5 2017-06-12 0.0 0.0 0 6 2017-06-13 0.0 0.0 0 7 2017-06-14 1.0 0.0 1 8 2017-06-15 0.0 0.0 1 9 2017-06-16 0.0 0.0 1 10 2017-06-19 0.0 0.0 1 11 2017-06-20 0.0 -1.0 0 12 2017-06-21 0.0 0.0 0 13 2017-06-22 0.0 0.0 0 14 2017-06-23 0.0 0.0 0 15 2017-06-26 0.0 0.0 0 16 2017-06-27 1.0 1.0 1 17 2017-06-28 1.0 1.0 1 18 2017-06-29 1.0 1.0 1 19 2017-06-30 0.0 1.0 1 20 2017-07-31 0.0 -1.0 0

1 个答案:

答案 0 :(得分:0)

您也可以使用diff

In [1185]: df['c'] = ((df.a.diff() > 0) | (df.b.diff() >= 0)).astype(int)

In [1186]: df
Out[1186]:
                 a       b  c
date
2017-06-05  1.1285  1.1110  0
2017-06-06  1.1285  1.1165  1
2017-06-07  1.1285  1.1202  1
2017-06-08  1.1285  1.1195  0
2017-06-09  1.1285  1.1166  0
2017-06-12  1.1285  1.1166  1
2017-06-13  1.1285  1.1166  1
2017-06-14  1.1296  1.1166  1
2017-06-15  1.1296  1.1167  1
2017-06-16  1.1296  1.1170  1
2017-06-19  1.1296  1.1132  0
2017-06-20  1.1296  1.1119  0
2017-06-21  1.1296  1.1119  1
2017-06-22  1.1296  1.1119  1
2017-06-23  1.1296  1.1119  1
2017-06-26  1.1296  1.1119  1
2017-06-27  1.1349  1.1128  1
2017-06-28  1.1391  1.1139  1
2017-06-29  1.1445  1.1145  1
2017-06-30  1.1445  1.1172  1