Python:创建一个基于条件更改的递增变量

时间:2015-01-28 21:36:15

标签: python loops pandas group-by

我想创建一个名为' 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

请注意'事件'在第一次出现rx时返回1。我习惯于在vbasic或SAS中执行此操作,您只需保留一个值,然后在每次满足阈值触发器时递增1。在Python中是否有类似的简单解决方案?

1 个答案:

答案 0 :(得分:1)

通常的方法是进行比较,然后进行累积求和。例如,像:

>>> 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