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

2024-10-08 19:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个样本数据集-

Id Category 

1  Active  
1  Active   
1  Active   
1  End      
2  Paused  
2  Active   
2  Active  

预期输出是基于计数器的新列,该计数器使用group by 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

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

任何提示都会有帮助


Tags: 数据iddfshiftcount计数器mask类别
2条回答

我们可以groupby两列和cumcount

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

您可以尝试:

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

相关问题 更多 >

    热门问题