2017-06-15 133 views
0

我有熊貓的數據框類似以下內容:如何根據熊貓數據框中的其他列生成新列?

   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 

我怎樣才能做到這一點優雅?謝謝!

回答

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 
+0

非常有幫助!謝謝! –