我有一个数据框,看起来像这样
user_id product_id created_at
1 100 2019-04-21 20:20:00
1 100 2019-04-23 00:10:00
1 200 2019-05-24 10:00:00
1 200 2020-06-24 10:10:24
2 100 2019-01-22 21:10:00
2 200 2019-04-25 20:23:30
2 300 2021-01-21 10:20:00
3 400 2019-12-21 10:20:00
3 400 2021-04-21 10:20:00我正在试着为每个user_id找出购买最多的product_id。我知道我可以结合使用groupby和value_counts或pd.Series.mode来实现这一点。如下所示:
df.groupby(['user_id'])['product_id',].apply(lambda x: x.value_counts().index[0]).reset_index()这可以很好地工作,直到我得到一个拥有两个或更多具有相同计数的product_id的user_id (就像在示例数据帧中一样)。当发生这种情况时,理想情况下,我希望选择具有最新created_at的product_id。因此,对于例如。对于user_id 1,我想选择product_id 200,因为它是最近购买的。
实现这一目标的最佳方式是什么?
发布于 2021-11-09 17:01:13
您可以计算日期的count和max,然后对这些值进行排序并删除重复项(或使用groupby().head()):
s = df.groupby(['user_id','product_id'])['created_at'].agg(['count','max'])
s.sort_values(['count','max'], ascending=False).groupby('user_id').head(1)输出:
count max
user_id product_id
3 400 2 2021-04-21 10:20:00
1 200 2 2020-06-24 10:10:24
2 300 1 2021-01-21 10:20:00发布于 2021-11-09 17:18:40
df.\
sort_values("created_at", ascending=False).\
groupby(["user_id", "product_id"], sort=False, as_index=False).\
count().\
groupby("user_id", as_index=False).\
head(1)# user_id product_id created_at
# 0 1 200 2
# 1 2 300 1
# 2 3 400 2https://stackoverflow.com/questions/69902065
复制相似问题