微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 在DataFrame中测试后续值

我有一个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] 举报,一经查实,本站将立刻删除。

相关推荐