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

如何根据id和符号变化识别组?

  •  1
  • VERBOSE  · 技术社区  · 11 月前

    我的输入是一个有一列的数据帧:

    import pandas as pd
    
    df = pd.DataFrame({'ID': ['A1-B1', 'A1-B2', 'A1-B3', 'A1-B8', 'A2-B10', 'A2-B16', 'A2-B9', 'A3-B13', 'A3-B14']})
    

    我正试图创建第二列,根据两件事来识别组:

    • Axx
    • Bxx的符号变化

    第1组:在A1中:Bxx的数量正在增加=B1到B8
    第2组:在A2中,Bxx的数量首先从B10增加到B16
    第三组:在A2中,Bxx的数量减少到B9
    第4组:在A3中,Bxx的数量从B13增加到B14

    我的预期输出是:

           ID  GROUP
    0   A1-B1      1
    1   A1-B2      1
    2   A1-B3      1
    3   A1-B8      1
    4  A2-B10      2
    5  A2-B16      2
    6   A2-B9      3
    7  A3-B13      4
    8  A3-B14      4
    

    我尝试使用findall和ngroup的想法,但效果不佳:

    new_df = df['ID'].str.findall(r'\d+').apply(lambda x: pd.Series(x))
    new_df.columns = ['Axx', 'Bxx']
    new_df['GROUP'] = new_df.groupby(['Axx', 'Bxx']).ngroup()
    print(new_df)
    
      Axx Bxx  GROUP
    0   1   1      0
    1   1   2      1
    2   1   3      2
    3   1   8      3
    4   2  10      4
    5   2  16      5
    6   2   9      6
    7   3  13      7
    8   3  14      8
    

    你们有什么建议吗?

    1 回复  |  直到 11 月前
        1
  •  2
  •   Dogbert    11 月前

    首先,提取以下整数值 a b 。然后分组 并签署变更 b 并存储 ngroup() + 1 :

    df[["a", "b"]] = df["ID"].str.extract(r"A(\d+)-B(\d+)").astype(int)
    
    df["GROUP"] = df.groupby([df["a"], df["b"].diff().le(0)]).ngroup() + 1
    
    df = df.drop(columns=["a", "b"])
    
    print(df)
    

    输出:

          ID  GROUP
    0   A1-B1      1
    1   A1-B2      1
    2   A1-B3      1
    3   A1-B8      1
    4  A2-B10      2
    5  A2-B16      2
    6   A2-B9      3
    7  A3-B13      4
    8  A3-B14      4
    

    不指定稍后删除的列的替代方法:

    ab = df["ID"].str.extract(r"A(\d+)-B(\d+)").astype(int)
    
    df["GROUP"] = df.groupby([ab[0], ab[1].diff().le(0)]).ngroup() + 1
    
    print(df)