python - 在熊猫中随条件变化
问题描述
这是我的数据框
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从我执行卖出操作的行中获取价格(卖出列中的真实值)
解决方案
只需移动有价格的行。当将其分配为新列时,sell
pandas 将自动将其与索引对齐。
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)]
推荐阅读
- laravel - Laravel 5.6:DOMPDF 不保存 PDF 文件
- python - Flask 中的 If 语句使用 SQL 数据库中的字符串变量
- scala - 如何编写一个 scala 函数来接受两种类型的参数?
- javascript - 了解 Jquery-Cropper 单位
- java - 即使调试正常,休眠也不删除对象?
- cassandra - Cassandra INSERT 和 UPDATE 语句失败 - 意外异常
- ruby-on-rails-4 - 在 Heroku 上使用 ImageMagick/MiniMagick 在 Rails 中将 TIFF 转换为 PDF
- sed - 两个命令的输出需要添加为列 awk
- kubernetes - 从已完成的 Kubernetes 批处理作业中复制文件
- django - 搜索功能什么都不返回 - Django