我想要创建一个名为'inc‘的变量,它在满足条件时按顺序递增(例如,Delta>=5),否则保持不变,并在每次遇到新组(本例中的ID)时将其重置为1。下面是一个数据here示例:
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的每个值中的观察进行分组,该值由一个增量<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的第一次出现时,“event”返回到1。我习惯于在vbasic或SAS中这样做,您只需保留一个值,然后在每次满足阈值触发器时增加1。在Python中有类似的简单解决方案吗?
发布于 2015-01-28 21:47:56
通常的方法是做一个比较,然后是一个累积和。例如,类似于:
>>> 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: int64https://stackoverflow.com/questions/28202870
复制相似问题