查找用户选择的第一个唯一项目,并按日期按用户选择的顺序对它们进行排名
find first unique items selected by user and ranking them in order of user selection by date
我试图在下面创建的数据框中的简化示例数据框中仅识别 "test" 客户购买的独特 "items" 的第一笔订单:
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" 的新列中,并删除同一用户对同一商品的任何重复(重复)订单。
为了进一步说明,同一用户在同一日期购买的那些商品应该具有相同的 order/rank,如图中客户 A55 所示(A10BABA 和 A10DBDB 排名为 1)。
我已经花了相当多的时间使用分组 and/or 排名操作的组合,但到目前为止没有成功。例如:
df["cust_item_rank"] = df.groupby("cust")["date"]["item"].rank(ascending = 1, method = "min")
产生错误(异常:已选择列日期)。
有人可以在这里指导我找到所需的解决方案吗?
# 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
为了解决这个问题,我在 cs95 的优秀初始答案的基础上构建了 pandas 中的排名函数,如下所示:
#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)
这导致了以下结果(期望的输出):
似乎使用 "min" 或 "dense" 排名方法解决了这个问题,但我选择了后者 "dense" 方法以避免跳过任何排名。
我试图在下面创建的数据框中的简化示例数据框中仅识别 "test" 客户购买的独特 "items" 的第一笔订单:
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" 的新列中,并删除同一用户对同一商品的任何重复(重复)订单。
为了进一步说明,同一用户在同一日期购买的那些商品应该具有相同的 order/rank,如图中客户 A55 所示(A10BABA 和 A10DBDB 排名为 1)。
我已经花了相当多的时间使用分组 and/or 排名操作的组合,但到目前为止没有成功。例如:
df["cust_item_rank"] = df.groupby("cust")["date"]["item"].rank(ascending = 1, method = "min")
产生错误(异常:已选择列日期)。
有人可以在这里指导我找到所需的解决方案吗?
# 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
为了解决这个问题,我在 cs95 的优秀初始答案的基础上构建了 pandas 中的排名函数,如下所示:
#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)
这导致了以下结果(期望的输出):
似乎使用 "min" 或 "dense" 排名方法解决了这个问题,但我选择了后者 "dense" 方法以避免跳过任何排名。