【问题标题】:How to generate sequence but avoid numbering duplicates in groups?如何生成序列但避免在组中编号重复?
【发布时间】:2021-09-17 23:55:26
【问题描述】:

我有一个如下所示的 pandas 数据框

df = pd.DataFrame({'sub_id': [101,101,101,102,102,103,104,104,105],
                   'test_id':['A1','A1','C1','A1','B1','D1','E1','A1','F1'],
                   'dummy':['hi','hello','how','are','you','am','fine','thank','you']})

我希望sub_idtest_id 的每个组合都有一个唯一的ID(序列号)

请注意one subject can have duplicate test_ids but dummy values will be different

同样,multiple subjects can share the same test_ids 如示例数据框所示

所以,我尝试了以下两种方法,但它们都不正确。

df.groupby(['sub_id','test_id']).cumcount()+1  # incorrect
df['seq_id'] = df.index + 1 # incorrect

我希望我的输出如下所示

【问题讨论】:

    标签: python pandas dataframe numpy pandas-groupby


    【解决方案1】:

    IIUC:

    通过ngroup()尝试:

    df['seq_id']=df.groupby(['sub_id','test_id'],sort=False).ngroup()+1
    

    df的输出:

       sub_id  test_id    dummy     seq_id
    0   101     A1          hi          1
    1   101     A1          hello       1
    2   101     C1          how         2
    3   102     A1          are         3
    4   102     B1          you         4
    5   103     D1          am          5
    6   104     E1          fine        6
    7   104     A1          thank       7
    8   105     F1          you         8
    

    【讨论】:

    • 为什么排序=假?它有什么区别?赞成
    • @TheGreat 如果您不写sort=False,那么您将无法按正确顺序获得特定组的 seq_id...即 seq_id 将按升序排序
    • 意思是,如果我们希望序列是特定的顺序(在每个组下),我们不是必须写sort=True吗?为什么sort=True 给出不正确的结果而sort=False 给出正确的结果(以正确的顺序)?我确实运行了代码并进行了验证。因此,问你为什么会有相反的行为?
    • @TheGreat 默认在groupby() 方法sort=True 中给出不正确的结果,因为它按升序对值进行排序,而不是当前行在数据框中的顺序以及我们何时覆盖sort=False 的排序参数然后它将根据数据框中的数据顺序给出确切的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多