新的数据帧取决于Python中先前行的多个条件
我有一个列a和b的数据框,如下所示:新的数据帧取决于Python中先前行的多个条件,python,pandas,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.1
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
我想根据以下条件为行生成一个返回值为1的新列c:
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(因为该行a的值增加),并在2017-06-19之前一直显示值1(因为b的值在该行下降,并且在2017-06-14和2017-06-16之间,c列的值应显示为1,因为b的值在2017-06-14 a列的值增加后没有下降。)
我花时间研究了np.where()函数,但似乎不容易实现上述逻辑,因为逻辑本身也取决于逻辑的结果
谢谢你的回答
---------------附加--------------------------
为了回答john的后续问题,让我用更清晰的输入和预期的答案重新编写示例(请忽略上述数据集):
日期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
您也可以使用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
首先,我为没有很好地表达而深表歉意。如果:条件A(df.A.diff()>0&df.b.diff()>0)或条件b(条件b后的df.b.diff()>0为真,只要条件A仍然为真),则c列应显示值1为true。如果条件B为false。则只有当条件A为true时,列C的值才能为1。根据上述逻辑,
2017-06-12 1.1285 1.1166 1 2017-06-13 1.1285 1.1166 1
这两行的列C应为零,因为2017-06-08上的B减小(条件B为false)。2017-06-09及以后的版本仅取决于条件A。我刚刚用干净的修订数据集和预期输出更新了我的问题。感谢您的耐心,因为我是stackoverflow的新用户。