测试DataFrame中的后续值[英] Testing subsequent values in a DataFrame

本文是小编为大家收集整理的关于测试DataFrame中的后续值的处理方法,想解了测试DataFrame中的后续值的问题怎么解决?测试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,这是一个相当熊猫的答案,不需要任何功能或适用.从这里 (我敢肯定还有其他答案)并感谢@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 方法非常轻松地做很多事情.

本文地址:https://www.itbaoku.cn/post/1728010.html