我有一个大熊猫的数据框如下:
Day Time MS Price Upper Lower
0 20161128 20:59:00 0 491.0 NaN NaN
1 20161128 20:59:00 500 498.0 NaN NaN
2 20161128 21:00:00 0 495.0 NaN NaN
3 20161128 21:00:00 500 495.0 NaN NaN
4 20161128 21:00:01 0 496.0 NaN NaN
5 20161128 21:00:01 500 494.0 NaN NaN
6 20161128 21:00:02 0 493.0 NaN NaN
7 20161128 21:00:02 500 493.0 NaN NaN
8 20161128 21:00:03 0 493.0 NaN NaN
9 20161128 21:00:03 500 493.0 NaN NaN
10 20161128 21:00:04 0 494.0 NaN NaN
11 20161128 21:00:04 500 495.0 NaN NaN
12 20161128 21:00:05 0 495.0 NaN NaN
13 20161128 21:00:05 500 494.0 NaN NaN
14 20161128 21:00:06 0 493.0 NaN NaN
15 20161128 21:00:06 500 493.0 NaN NaN
16 20161128 21:00:07 0 491.0 NaN NaN
17 20161128 21:00:07 500 491.0 NaN NaN
18 20161128 21:00:08 0 491.0 NaN NaN
19 20161128 21:00:08 500 491.0 493 489
20 20161128 21:00:09 0 492.0 489 480
21 20161128 21:00:09 500 492.0 490 460
22 20161128 21:00:10 0 493.0 499 490
23 20161128 21:00:10 500 492.0 499 490
24 20161128 21:00:11 0 490.0 499 489
我想计算并生成一个新列来识别列" Price"高于"上"或低于"降低"。如果高于标记" U",则降低标记" D",否则标记" M"。
我想要的结果如下:
Day Time MS Price Upper Lower POS
0 20161128 20:59:00 0 491.0 NaN NaN NaN
1 20161128 20:59:00 500 498.0 NaN NaN NaN
2 20161128 21:00:00 0 495.0 NaN NaN NaN
3 20161128 21:00:00 500 495.0 NaN NaN NaN
4 20161128 21:00:01 0 496.0 NaN NaN NaN
5 20161128 21:00:01 500 494.0 NaN NaN NaN
6 20161128 21:00:02 0 493.0 NaN NaN NaN
7 20161128 21:00:02 500 493.0 NaN NaN NaN
8 20161128 21:00:03 0 493.0 NaN NaN NaN
9 20161128 21:00:03 500 493.0 NaN NaN NaN
10 20161128 21:00:04 0 494.0 NaN NaN NaN
11 20161128 21:00:04 500 495.0 NaN NaN NaN
12 20161128 21:00:05 0 495.0 NaN NaN NaN
13 20161128 21:00:05 500 494.0 NaN NaN NaN
14 20161128 21:00:06 0 493.0 NaN NaN NaN
15 20161128 21:00:06 500 493.0 NaN NaN NaN
16 20161128 21:00:07 0 491.0 NaN NaN NaN
17 20161128 21:00:07 500 491.0 NaN NaN NaN
18 20161128 21:00:08 0 491.0 NaN NaN NaN
19 20161128 21:00:08 500 491.0 493 489 M
20 20161128 21:00:09 0 492.0 489 480 U
21 20161128 21:00:09 500 492.0 490 460 U
22 20161128 21:00:10 0 493.0 499 490 M
23 20161128 21:00:10 500 480.0 499 490 D
24 20161128 21:00:11 0 482.0 499 489 D
我怎样才能优雅地做到这一点?谢谢!
答案 0 :(得分:1)
您可以使用apply来比较每行的价格与上限和下限。
df['POS'] = df.apply(lambda x: np.nan if pd.isnull(x.Upper) \
else 'U' if x.Price>x.Upper
else 'D' if x.Price<x.Lower \
else 'M', axis=1)
df
Out[39]:
Day Time MS Price Upper Lower POS
0 20161128 20:59:00 0 491.0 NaN NaN NaN
1 20161128 20:59:00 500 498.0 NaN NaN NaN
2 20161128 21:00:00 0 495.0 NaN NaN NaN
3 20161128 21:00:00 500 495.0 NaN NaN NaN
4 20161128 21:00:01 0 496.0 NaN NaN NaN
5 20161128 21:00:01 500 494.0 NaN NaN NaN
6 20161128 21:00:02 0 493.0 NaN NaN NaN
7 20161128 21:00:02 500 493.0 NaN NaN NaN
8 20161128 21:00:03 0 493.0 NaN NaN NaN
9 20161128 21:00:03 500 493.0 NaN NaN NaN
10 20161128 21:00:04 0 494.0 NaN NaN NaN
11 20161128 21:00:04 500 495.0 NaN NaN NaN
12 20161128 21:00:05 0 495.0 NaN NaN NaN
13 20161128 21:00:05 500 494.0 NaN NaN NaN
14 20161128 21:00:06 0 493.0 NaN NaN NaN
15 20161128 21:00:06 500 493.0 NaN NaN NaN
16 20161128 21:00:07 0 491.0 NaN NaN NaN
17 20161128 21:00:07 500 491.0 NaN NaN NaN
18 20161128 21:00:08 0 491.0 NaN NaN NaN
19 20161128 21:00:08 500 491.0 493.0 489.0 M
20 20161128 21:00:09 0 492.0 489.0 480.0 U
21 20161128 21:00:09 500 492.0 490.0 460.0 U
22 20161128 21:00:10 0 493.0 499.0 490.0 M
23 20161128 21:00:10 500 492.0 499.0 490.0 M
24 20161128 21:00:11 0 490.0 499.0 489.0 M