首页 > 解决方案 > 在熊猫中随条件变化

问题描述

这是我的数据框

                 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 行。但是,如果这一行中的列价格NaN,我想以有效价格在下一行出售。
所以预期的输出是:

                 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

如何用熊猫填充销售列?我知道移位方法。但它不能在这里使用,因为我在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从我执行卖出操作的行中获取价格(卖出列中的真实值)

标签: pythonpandas

解决方案


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

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

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


更新:要从卖出行添加卖出价格,我们可以使用相同的方法,只是反过来:

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

推荐阅读