Python:创建一个根据条件变化的递增变量

Python: Create an incrementing variable that changes based on a condition

我想创建一个名为 'inc' 的变量,该变量在每次满足条件(例如,Delta>=5)时按顺序递增,否则保持不变,并在每次遇到新条件时重置为 1组(本例中的 ID)。所以这是一个示例数据框:

from pandas import *
d={'rx': [1,1,1,1,1,2,2,2,2,2],
    'vals': [1,2,3,8,10,1,10,20,21,22]}
df=DataFrame(d)


def diff_func(df):
    return df.diff()                                

df['delta'] = df.groupby(['rx'])['vals'].apply(diff_func)  

产生这个:

rx  vals delta
1   1    NaN
1   2    1
1   3    1
1   8    5
1   10   2
2   1    NaN
2   10   9
2   20   10
2   21   1
2   22   1

所以现在我想创建一个名为 'Event' 的新列,稍后我将使用它来对 rx 的每个值内的观察值进行分组,用 delta < 5:

分隔
rx  vals    delta   Event
1   1       NaN     1
1   2       1       1
1   3       1       1
1   8       5       2
1   10      2       2
2   1       NaN     1
2   10      9       2
2   20      10      3
2   21      1       3
2   22      1       3

请注意,'event' returns 在第一次出现 rx 时变为 1。我习惯在 vbasic 或 SAS 中这样做,您只需保留一个值,然后在每次满足阈值触发器时递增 1。在 Python 中是否有类似的简单解决方案?

通常的做法是做比较,然后累加。例如,类似于:

>>> df["Event"] = (df["delta"] >= 5).groupby(df["rx"]).cumsum() + 1
>>> df
   rx  vals  delta  Event
0   1     1    NaN      1
1   1     2      1      1
2   1     3      1      1
3   1     8      5      2
4   1    10      2      2
5   2     1    NaN      1
6   2    10      9      2
7   2    20     10      3
8   2    21      1      3
9   2    22      1      3

之所以有效,是因为(为简单起见忽略 groupby 并仅关注 rx == 1:) False == 0True == 1:

>>> df["delta"]
0   NaN
1     1
2     1
3     5
4     2
Name: delta, dtype: float64
>>> df["delta"] >= 5
0    False
1    False
2    False
3     True
4    False
Name: delta, dtype: bool
>>> (df["delta"] >= 5).cumsum()
0    0
1    0
2    0
3    1
4    1
Name: delta, dtype: int64