我通过 Python 学习 Pandas 大约 3 天,遇到了让我困惑的第一个问题。我已经成功地完成了所需的各种计算,而不必遍历我正在处理的表的每一行,但我不确定是否有办法对以下问题执行相同的操作。
出于本问题的目的,我尝试使用的表格可以归结为只有 2 列。第一列是“日期”,第二列是“订单”。 “order”列的值大部分为 0,散布着一些 1 和 -1。不知道如何在我的问题中表明这一点,但类似......
Date Order
0 2017-03-15 0
1 2017-03-14 1
2 2017-03-13 0
3 2017-03-12 0
4 2017-03-11 -1
5 2017-03-10 0
6 2017-03-09 0
7 2017-03-08 1
我想添加另一列,称为“状态”,它首先基于“订单”列,但也基于“状态”列,具体取决于“订单”列的值。
如果我在 Excel 中的状态列中添加公式,则为: =if(order = 1, 1, if(order = -1, -1, status[来自第 1 行]))
因此生成的表格将如下所示:
Date Order Status
0 2017-03-15 0 0
1 2017-03-14 1 1
2 2017-03-13 0 1
3 2017-03-12 0 1
4 2017-03-11 -1 -1
5 2017-03-10 0 -1
6 2017-03-09 0 -1
7 2017-03-08 1 1
在初始分类之后,状态列应该仅以 1 或 -1 结束(但在此之前可能以 0 开头)。虽然顺序列通常在 1 和 -1 之间交替(除了散布的 0),但顺序列也有可能有一个 1,例如,在下一行中或在几行之后跟着另一个 1, -1 之前。这是一个我可以忽略的输入数据错误,但代码可能需要考虑到这一点。
我目前正在使用 Pandas,但如果需要的话也可以使用 numpy。
希望这已经足够清楚了。原谅糟糕的格式。并感谢您的帮助。
最佳答案
mask
、ffill
和 fillna
的组合
o = df.Order
df.assign(Status=o.mask(o == 0).ffill().fillna(o).astype(int))
Date Order Status
0 2017-03-15 0 0
1 2017-03-14 1 1
2 2017-03-13 0 1
3 2017-03-12 0 1
4 2017-03-11 -1 -1
5 2017-03-10 0 -1
6 2017-03-09 0 -1
7 2017-03-08 1 1
关于python - 在 python/pandas 中部分基于自身计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43196806/