测试DataFrame中的后续值

ASG*_*SGM 5 python pandas

我有一个带有正负整数的一列的DataFrame。对于每一行,我想查看有多少连续的行(从当前行开始并包括当前行)具有负值。

因此,如果一个序列是2, -1, -3, 1, -1,结果将是0, 2, 1, 0, 1

我可以通过遍历所有索引,使用.iloc拆分列以及next()找出下一个正值在哪里来做到这一点。但是我觉得这并没有利用熊猫的功能,我想还有一种更好的方法。我已经尝试过使用.shift()expanding_window但没有成功。

有没有一种更“泛泛的”方式来找出当前行满足某个逻辑条件之后连续多少行?

这是现在正在工作的内容:

import pandas as pd

df = pd.DataFrame({"a": [2, -1, -3, -1, 1, 1, -1, 1, -1]})

df["b"] = 0
for i in df.index:
    sub = df.iloc[i:].a.tolist()
    df.b.iloc[i] = next((sub.index(n) for n in sub if n >= 0), 1)
Run Code Online (Sandbox Code Playgroud)

编辑:我意识到,当结尾处有多个负值时,即使我自己的示例也不起作用。因此,有必要提供更好的解决方案。

编辑2:我说这个问题在整数的条件,但原本只把1-1我的例子。我通常需要求解正整数和负整数。

Joh*_*hnE 5

FWIW,这是一个相当宽泛的答案,不需要任何功能或不适用。从这里借用(我敢肯定还有其他答案),并感谢@DSM提到了ascending = False选项:

df = pd.DataFrame({"a": [2, -1, -3, -1, 1, 1, -1, 1, -1, -2]})

df['pos'] = df.a > 0
df['grp'] = ( df['pos'] != df['pos'].shift()).cumsum()
dfg = df.groupby('grp')
df['c'] = np.where( df['a'] < 0, dfg.cumcount(ascending=False)+1, 0 )

   a  b    pos  grp  c
0  2  0   True    1  0
1 -1  3  False    2  3
2 -3  2  False    2  2
3 -1  1  False    2  1
4  1  0   True    3  0
5  1  0   True    3  0
6 -1  1  False    4  1
7  1  0   True    5  0
8 -1  1  False    6  2
9 -2  1  False    6  1
Run Code Online (Sandbox Code Playgroud)

我认为这种方法的好处是,一旦设置了“ grp”变量,您就可以使用标准的groupby方法轻松地完成很多事情。

  • 这更接近我要写的内容,但是您可以通过执行诸如cumcount(ascending = False)+1之类的操作来简化操作。不过,我懒得检查极端情况。:-) (2认同)