我想创建一个名为' 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中是否有类似的简单解决方案?
答案 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 == 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