如何根据熊猫数据框中的其他列生成新列?
问题描述:
我有熊猫的数据框类似以下内容:如何根据熊猫数据框中的其他列生成新列?
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
我想要计算并生成新的列来识别列“价格”比“上”高于或低于“下限”。如果高于标记“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
我怎样才能做到这一点优雅?谢谢!
答
您可以使用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
非常有帮助!谢谢! –