【问题标题】:Shift with condition in pandas在熊猫中随条件变化
【发布时间】:2020-12-26 19:04:29
【问题描述】:

这是我的数据框

                 dt_object     price  buy  
311684 2020-12-24 18:15:00  73.98250  NaN   
311685 2020-12-24 18:30:00       NaN  NaN   
311686 2020-12-24 18:45:00  73.98520  NaN   
311687 2020-12-24 19:00:00  74.16250 True   
311688 2020-12-24 19:15:00  74.06500  NaN   
311689 2020-12-24 19:30:00  74.01000  NaN   
311690 2020-12-24 19:45:00  74.12690  NaN  
311691 2020-12-24 20:00:00  74.04500  NaN   
311692 2020-12-24 20:15:00  74.05090  NaN   
311693 2020-12-24 20:30:00       NaN  NaN   
311694 2020-12-24 20:45:00  74.02670  NaN   
311695 2020-12-24 21:00:00  73.99356 True   
311696 2020-12-24 21:15:00  74.01461  NaN   
311697 2020-12-24 21:30:00  74.02120  NaN   
311698 2020-12-24 21:45:00  73.95500  NaN  
311699 2020-12-24 22:00:00  73.95800  NaN   
311700 2020-12-24 22:15:00  73.95900  NaN   
311701 2020-12-24 22:30:00  73.98760  NaN   
311702 2020-12-24 22:45:00  73.98100 True   
311703 2020-12-24 23:00:00  73.90500  NaN   
311704 2020-12-24 23:15:00  73.91300  NaN   
311705 2020-12-24 23:30:00       NaN  NaN   
311706 2020-12-24 23:45:00       NaN  NaN   
311707 2020-12-25 00:00:00  74.06600  NaN  
311708 2020-12-25 00:15:00  73.97810  NaN   
311709 2020-12-25 00:30:00  74.00020  NaN
311710 2020-12-25 00:45:00  73.81300  NaN
311711 2020-12-25 01:00:00  73.99950  NaN

购买列中,您可以看到我在哪里购买股票。我想把它卖到下面 3 行。但是,如果这一行中的列 priceNaN,我想以有效价格在下一行出售。
所以预期的输出是:

                 dt_object     price  buy  sell
311684 2020-12-24 18:15:00  73.98250  NaN   NaN
311685 2020-12-24 18:30:00       NaN  NaN   NaN
311686 2020-12-24 18:45:00  73.98520  NaN   NaN
311687 2020-12-24 19:00:00  74.16250 True   NaN
311688 2020-12-24 19:15:00  74.06500  NaN   NaN
311689 2020-12-24 19:30:00  74.01000  NaN   NaN
311690 2020-12-24 19:45:00  74.12690  NaN  True
311691 2020-12-24 20:00:00  74.04500  NaN   NaN
311692 2020-12-24 20:15:00  74.05090  NaN   NaN
311693 2020-12-24 20:30:00       NaN  NaN   NaN
311694 2020-12-24 20:45:00  74.02670  NaN   NaN
311695 2020-12-24 21:00:00  73.99356 True   NaN
311696 2020-12-24 21:15:00  74.01461  NaN   NaN
311697 2020-12-24 21:30:00  74.02120  NaN   NaN
311698 2020-12-24 21:45:00  73.95500  NaN  True
311699 2020-12-24 22:00:00  73.95800  NaN   NaN
311700 2020-12-24 22:15:00  73.95900  NaN   NaN
311701 2020-12-24 22:30:00  73.98760  NaN   NaN
311702 2020-12-24 22:45:00  73.98100 True   NaN
311703 2020-12-24 23:00:00  73.90500  NaN   NaN
311704 2020-12-24 23:15:00  73.91300  NaN   NaN
311705 2020-12-24 23:30:00       NaN  NaN   NaN
311706 2020-12-24 23:45:00       NaN  NaN   NaN
311707 2020-12-25 00:00:00  74.06600  NaN  True
311708 2020-12-25 00:15:00  73.97810  NaN   NaN
311709 2020-12-25 00:30:00  74.00020  NaN   NaN
311710 2020-12-25 00:45:00  73.81300  NaN   NaN
311711 2020-12-25 01:00:00  73.99950  NaN   NaN

如何用 pandas 填充 sell 列?我知道 shift 方法。但它不能在这里使用,因为我在 price 列中有 NaN 值。

更新
Stef完美地回答了我问题的第一部分。让我问你第二部分。
我想在我购买行动的行中看到卖出价格。它让我可以连续查看买入和卖出价格。
预期输出:

                 dt_object     price  buy  sell   sell_price
311684 2020-12-24 18:15:00  73.98250  NaN   NaN          NaN
311685 2020-12-24 18:30:00       NaN  NaN   NaN          NaN
311686 2020-12-24 18:45:00  73.98520  NaN   NaN          NaN
311687 2020-12-24 19:00:00  74.16250 True   NaN     74.12690
311688 2020-12-24 19:15:00  74.06500  NaN   NaN          NaN
311689 2020-12-24 19:30:00  74.01000  NaN   NaN          NaN
311690 2020-12-24 19:45:00  74.12690  NaN  True          NaN
311691 2020-12-24 20:00:00  74.04500  NaN   NaN          NaN
311692 2020-12-24 20:15:00  74.05090  NaN   NaN          NaN
311693 2020-12-24 20:30:00       NaN  NaN   NaN          NaN
311694 2020-12-24 20:45:00  74.02670  NaN   NaN          NaN
311695 2020-12-24 21:00:00  73.99356 True   NaN     73.95500  
311696 2020-12-24 21:15:00  74.01461  NaN   NaN          NaN
311697 2020-12-24 21:30:00  74.02120  NaN   NaN          NaN
311698 2020-12-24 21:45:00  73.95500  NaN  True          NaN
311699 2020-12-24 22:00:00  73.95800  NaN   NaN          NaN
311700 2020-12-24 22:15:00  73.95900  NaN   NaN          NaN
311701 2020-12-24 22:30:00  73.98760  NaN   NaN          NaN
311702 2020-12-24 22:45:00  73.98100 True   NaN     74.06600
311703 2020-12-24 23:00:00  73.90500  NaN   NaN          NaN
311704 2020-12-24 23:15:00  73.91300  NaN   NaN          NaN
311705 2020-12-24 23:30:00       NaN  NaN   NaN          NaN
311706 2020-12-24 23:45:00       NaN  NaN   NaN          NaN
311707 2020-12-25 00:00:00  74.06600  NaN  True          NaN
311708 2020-12-25 00:15:00  73.97810  NaN   NaN          NaN
311709 2020-12-25 00:30:00  74.00020  NaN   NaN          NaN
311710 2020-12-25 00:45:00  73.81300  NaN   NaN          NaN
311711 2020-12-25 01:00:00  73.99950  NaN   NaN          NaN

sell_price 从我执行卖出操作的行中获取价格(sell 列中的真实值)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    只需移动有价格的行。当将其分配为新列时,sellpandas 会自动将其与索引对齐。

    df['sell'] = df[df.price.notna()].buy.shift(3)
    

    根据@ansev 下面的评论,df.loc[df.price.notna(), 'buy'].shift(3) 甚至更好。


    更新:要从卖出行添加卖出价,我们可以使用相同的方法,反之亦然:

    df['sell_price'] = df.loc[df.price.notna(), 'price'].shift(-3).loc[df.buy.fillna(False)]
    

    【讨论】:

    • df.loc[df.price.notna(), 'buy'].shift(3) :)
    • @ansev 哦,是的,当然 - 谢谢,我会编辑它
    • 谢谢,亲爱的朋友!我在底部添加了一条新评论。请看一下。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2022-12-11
    • 2019-07-25
    • 1970-01-01
    • 2022-11-17
    • 2019-04-11
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多