2

我在熊猫中有这个数据框:

   col1    col2
0     1    -0.5
1     2    -4.0
2     8     3.0
3     9     6.0
4     4   345.0
5     6    -7.0
6     7  3456.0
7    47     3.0
8     2     5.0
9     4   -78.0

我只想返回这些行,其中前 3 行的“col2”值大于 0。在这种情况下:

5     6    -7.0

 9     4   -78.0

我已经尝试过滚动但找不到方法。你能帮我吗?:)

4

2 回答 2

5

与 SeaBean 的答案非常相似,但不使用apply

>>> df[df['col2'].shift().gt(0).rolling(3).sum().eq(3)]
   col1  col2
5     6  -7.0
9     4 -78.0

您使用shift这样就不必考虑前 3 行,而不必考虑每一行及其后面的 2 行。然后制作一个正值掩码 ( .gt(0)),并在该掩码上使用 3 的滚动窗口,检查哪些组的总和为 3。

于 2021-06-22T15:44:03.907 回答
3

您可以使用.rolling(3)oncol2查看 3 个条目的窗口,然后使用gt(0).all()来检查所有这 3 个条目是否 > 0。由于您要检查不包括当前条目的前 3 个条目,我们进一步使用.shift(). 然后用于.loc定位此类条目:

df.loc[df['col2'].rolling(3).apply(lambda x: x.gt(0).all()).shift() > 0]

受 Tom 启发,另一个不使用 using的解决方案.apply()如下:

df.loc[df['col2'].shift().gt(0).rolling(3).min().eq(1)]

在这里,我们.rolling(3).min().eq(1)在布尔序列上使用 withgt(0)来检查所有 3 个条目的最小值是否为 1(这意味着所有条目必须是True,因为在计算True中转换为 并转换为)。实际上,我们得到了与以前的解决方案相同的效果。1False0gt(0).all()

这个概念的好处是,无论滚动窗口大小是多少,min().eq(1)当滚动窗口大小发生变化时,我们仍然可以检查而不需要调整这部分代码。


结果:

   col1  col2
5     6  -7.0
9     4 -78.0
于 2021-06-22T15:41:13.830 回答