我有一个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)
编辑:我意识到,当最后有一个以上的负值时,即使我自己的例子也不起作用.这样就可以提供更好的解决方案.
编辑2:我用整数表示问题,但最初只在我的例子中加1和-1.我需要解决一般的正负整数.
解决方法:
FWIW,这是一个相当简洁的答案,不需要任何功能或适用.借用here(其他答案我很确定)并感谢@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
我认为这个方法的一个好处是,一旦你设置’grp’变量,你可以使用标准的groupby方法很容易地做很多事情.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。