Skip to main content
 首页 » 编程设计

python之如果前一列中的值不同,则制作一个增加的计数器

2025年05月04日19三少

我正在制作一个计数器列,它仅在 (i-1) 的值与 i 的值不同时才增加。

下面是一个示例数据:

user_id sc_id 
1         100 
1         100 
1         101 
1         100 
2         100 
2         105 
3         105 
3         105 

下面是我的代码:

df['subcat_counter'] = 1 
 
for i in range(1,len(df)): 
    if df.sc_id[i-1]==df.sc_id[i] and df['user_id'][i-1]==df['user_id'][i]: 
        df.at[i,'subcat_counter']=df.subcat_counter[i-1] 
    else: 
        df.at[i,'subcat_counter']=df.subcat_counter[i-1]+1 

下面是所需的输出:

user_id sc_id   subcat_counter 
1         100    1 
1         100    1 
1         101    2 
1 .       100    3 
2         100    4 
2         105    5 
3         105    6 
3         105    6 

错误:

KeyError: 0

请您参考如下方法:

使用GroupBy.ngroup :

df1 = df[['user_id','sc_id']].ne(df[['user_id','sc_id']].shift()).cumsum().add_prefix('g_') 
 
df['subcat_counter'] = df.join(df1).groupby(['g_user_id','g_sc_id'], sort=False).ngroup() + 1 
print (df) 
   user_id  sc_id  subcat_counter 
0        1    100               1 
1        1    100               1 
2        1    101               2 
3        1    100               3 
4        2    100               4 
5        2    105               5 
6        3    105               6 
7        3    105               6 

另一种解决方案:

s = df['user_id'].astype(str) + '_' + df['sc_id'].astype(str)  
df['subcat_counter'] = s.ne(s.shift()).cumsum() 
print (df) 
 
   user_id  sc_id  subcat_counter 
0        1    100               1 
1        1    100               1 
2        1    101               2 
3        1    100               3 
4        2    100               4 
5        2    105               5 
6        3    105               6 
7        3    105               6