在python中使用具有group by的条件滚动计数



我有一个样本数据集-

Id Category 
1  Active  
1  Active   
1  Active   
1  End      
2  Paused  
2  Active   
2  Active  

预期输出是一个基于计数器的新列,该列使用id分组,并在类别更改时重置计数器。

预期输出:-

Id Category Count
1  Active   0
1  Active   1
1  Active   2
1  End      0
2  Omitted  0
2  Active   0
2  Active   1

我已经使用了以下-

m = df['Category'] != df['Category'].shift(-1)
df['count'] = np.where(m, df.groupby(m.ne(m.shift(),'Id').cumsum()).cumcount()+1, 0)

但它只填充0

我也试过这个-

mask = df['Id'] == df['Id'].shift(-1)
df['CatChange'] = df['Category'] != df['Category'].shift(-1)
count = df[mask].groupby('Id').cumcount()
df['CatChange_num'] = count

这只是在不考虑类别更改的情况下增加值。

任何指针都会有所帮助。

您可以尝试:

df['count'] = df.groupby(['Id','Category']).cumcount()

如果你想让你的计数从1开始,你可以这样做:

df['count2'] = df.groupby(['Id','Category']).cumcount() + 1

哪个print:

Id Category  count  count2
0   1   Active      0       1
1   1   Active      1       2
2   1   Active      2       3
3   1      End      0       1
4   2   Paused      0       1
5   2   Active      0       1
6   2   Active      1       2

我们可以groupby两列和cumcount

df.groupby(['d','Category']).cumcount()
0    0
1    1
2    2
3    0
4    0
5    0
6    1
dtype: int64

最新更新