【问题标题】:How can I generate a new column according other column in dataframe of pandas?如何根据熊猫数据框中的其他列生成新列?
【发布时间】:2017-06-15 01:28:50
【问题描述】:

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

             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

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

【问题讨论】:

    标签: pandas dataframe


    【解决方案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
    

    【讨论】:

    • 非常有帮助!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2017-01-14
    • 2020-10-21
    • 2019-12-09
    • 2017-03-11
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多