我有一个带有正负整数的一列的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我的例子。我通常需要求解正整数和负整数。
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方法轻松地完成很多事情。