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

查找用户选择的第一个唯一项并按用户选择的顺序对其排序

  •  1
  • veg2020  · 技术社区  · 6 年前

    df=pd.DataFrame({"cust": ['A55', 'A55', 'A55', 'B080', 'B080', 'D900', 'D900', 'D900', 'D900', 'C019', 'C019', 'Z09c', 'A987', 'A987', 'A987'],
        "date":['01/11/2016', '01/11/2016', '01/11/2016', '08/17/2016', '6/17/2016','03/01/2016',
               '04/30/2016', '05/16/2016','09/27/2016', '04/20/2016','04/29/2016', '07/07/2016', '1/29/2016', '10/17/2016', '11/11/2016' ],
        "item": ['A10BABA', 'A10BABA', 'A10DBDB', 'A9GABA', 'A11AD', 'G198A', 'G198A', 'F673', 'A11BB', 'CBA1', 'CBA1', 'DA21',
                'BG10A', 'CG10BA', 'BG10A']
    })
    
    df.date = pd.to_datetime(df.date)
    
    df = df.sort_values(["cust", "date"], ascending = True)
    

    所需的输出将如图所示-在名为“cust_item_rank”的新列中按购买日期订购所有唯一的项目,并删除同一用户对同一项目的任何重复订单。

    为了进一步澄清,由同一用户在同一日期购买的物品应具有与客户A55所示的相同的顺序/等级(A10BABA和A10DBDB被列为1)。 enter image description here

    我花了相当长的一段时间来使用group by和/或rank操作的组合,但迄今为止没有成功。例如:

    df["cust_item_rank"] = df.groupby("cust")["date"]["item"].rank(ascending = 1, method = "min")
    

    产生错误(异常:列日期已选定)。

    有人能告诉我这里想要的解决方案吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   cs95 abhishek58g    6 年前
    # Remove duplicates
    df2 = (df.loc[~df.groupby(['cust'])['item'].apply(pd.Series.duplicated)]
             .reset_index(drop=True))
    df2['cust_item_rank'] = df2.groupby('cust').cumcount().add(1)
    

    df2
        cust       date     item  cust_item_rank
    0    A55 2016-01-11  A10BABA               1
    1    A55 2016-11-01  A10DBDB               2
    2   A987 2016-01-29    BG10A               1
    3   A987 2016-10-17   CG10BA               2
    4   B080 2016-06-17    A11AD               1
    5   B080 2016-08-17   A9GABA               2
    6   C019 2016-04-20     CBA1               1
    7   D900 2016-03-01    G198A               1
    8   D900 2016-05-16     F673               2
    9   D900 2016-09-27    A11BB               3
    10  Z09c 2016-07-07     DA21               1