python - 在 python/pandas 中部分基于自身计算列

标签 python python-3.x pandas numpy

我通过 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。

希望这已经足够清楚了。原谅糟糕的格式。并感谢您的帮助。

最佳答案

maskffillfillna 的组合

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/

相关文章:

python - 使用我自己的 gensalt() - 它足够安全吗?

python - 使用 Peewee 处理数据库断开连接

python - 在Python中读取单个字符(而不是字节)而不等待行尾或EOF

python - 如何在 pandas 中将 n*m DataFrame 与 1*m DataFrame 相乘?

python - 在 PyMC3 中处理大型数据集时出现 "Bracket nesting level exceeded maximum"

python - 计算图中所有连接的节点

python - 使用 async/await 从 python 异步调用 AWS Lambda 函数

python - 从列表中以相反的顺序删除短语

python - Pandas 系列 - 计算列值之间的行数

python-3.x - 有条件地分割长行的最 Pythonic/最有效的方法是什么?