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