如何创建在 Python 组的子组内递增的新列?

How to create a new column that increments within a subgroup of a group in Python?

我遇到了一个问题,我需要将数据分成两组,并附上一个对子组进行计数的列。

示例数据框如下所示:

colA colB
 1     a 
 1     a  
 1     c  
 1     c  
 1     f  
 1     z 
 1     z  
 1     z  
 2     a  
 2     b  
 2     b
 2     b
 3     c  
 3     d  
 3     k  
 3     k 
 3     m  
 3     m  
 3     m      

附加新列后的预期输出如下:

colA colB colC
 1     a    1
 1     a    1
 1     c    2
 1     c    2
 1     f    3
 1     z    4
 1     z    4
 1     z    4
 2     a    1
 2     b    2
 2     b    2
 2     b    2
 3     c    1  
 3     d    2 
 3     k    3    
 3     k    3 
 3     m    4
 3     m    4
 3     m    4

我尝试了以下方法,但无法解决这个看似微不足道的问题:

我试过的解决方案 1 不符合我的要求:

df['ONES']=1
df['colC']=df.groupby(['colA','colB'])['ONES'].cumcount()+1
df.drop(columns='ONES', inplace=True)

我也玩过 transform 和 cumsum 函数,并应用过,但我似乎无法解决这个问题。感谢任何帮助。

编辑:数据帧上的小错误。

编辑 2:为简单起见,我为 B 列显示了相似的值,但问题是在一个更大的组中(由 colA 表示),colB 可能不同,因此,它需要在同时.

编辑 3:更新了数据框以强调我第二次编辑的意思。希望这会使它更清晰和可重现。

您可以使用 groupby + ngroup:

df['colC'] = df.groupby('colA').apply(lambda x: x.groupby('colB').ngroup()+1).droplevel(0)

输出:

    colA colB  colC
0      1    a     1
1      1    a     1
2      1    c     2
3      1    c     2
4      1    f     3
5      1    z     4
6      1    z     4
7      1    z     4
8      2    a     1
9      2    b     2
10     2    b     2
11     2    b     2
12     3    c     1
13     3    d     2
14     3    k     3
15     3    k     3
16     3    m     4
17     3    m     4
18     3    m     4

断然分解

df['colC'] =df['colB'].astype('category').cat.codes+1



 colA colB  colC
0      1    a     1
1      1    a     1
2      1    b     2
3      1    b     2
4      1    c     3
5      1    d     4
6      1    d     4
7      1    d     4
8      2    a     1
9      2    b     2
10     2    b     2
11     2    b     2
12     3    a     1
13     3    b     2
14     3    c     3
15     3    c     3
16     3    d     4
17     3    d     4
18     3    d     4