如何根据pandas的数据框中的其他列生成新列?

时间:2017-06-15 01:28:50

标签: pandas dataframe

我有一个大熊猫的数据框如下:

             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

我怎样才能优雅地做到这一点?谢谢!

1 个答案:

答案 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