代码之家  ›  专栏  ›  技术社区  ›  kukushkin

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

  •  0
  • kukushkin  · 技术社区  · 3 年前

    我有一个问题,我需要将数据分为两组,并附加一列来计算子组。

    示例dataframe如下所示:

    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函数和apply,但我似乎无法解决这个问题。感谢您的帮助。

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

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

    编辑3:更新数据框以强调我第二次编辑的意思。希望这能让它更清晰,更具可复制性。

    2 回复  |  直到 3 年前
        1
  •  1
  •   enke    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
    
        2
  •  0
  •   wwnde    3 年前

    绝对地,分解

    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