找到用户选择的第一个唯一项,然后按用户选择的日期对它们进行排序

问题描述 投票:1回答:2

我正在尝试从简化的示例数据框中,从下面创建的数据框中识别“测试”客户购买的唯一“项目”的第一订单:

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

我花了相当多的时间使用分组和/或排名操作的组合,但到目前为止没有成功。例如:

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

产生错误(例外:已选择列日期)。

有人可以在这里引导我找到所需的解决方案吗?

python pandas dataframe group-by rank
2个回答
2
投票
# 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

2
投票

为了解决这个问题,我建立在cs95出色的初始答案之上,并在pandas中调用了rank函数,如下所示:

#remove duplicates as recommended by cs95
df2 = (df.loc[~df.groupby(['cust'])['item'].apply(pd.Series.duplicated)]
         .reset_index(drop=True))

#rank by date afer grouping by customer
df2["cust_item_rank"]= df2.groupby(["cust"])["date"].rank(ascending=1,method='dense').astype(int)

这导致以下结果(期望的输出):enter image description here

[似乎使用“最小”或“密集”排名方法可以解决此问题,但我选择了后者的“密集”方法来避免跳过任何排名。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.