我有一个包含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
答案 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