【发布时间】:2021-04-16 17:11:27
【问题描述】:
我问了一个类似但更简单的问题previously,但后来意识到这并不能解决我的问题。我觉得对问题的必要编辑对于简单编辑问题来说太严格了,尤其是已经有两个有效答案,所以我会让它保持不变,而是问一个新的:
我有以下DataFrame 不同客户在不同时间的互动(查看和/或购买的产品):
import pandas as pd
rng = list(pd.date_range('2019-02-24', periods=5, freq='T')) + list(pd.date_range('2019-03-13', periods=2, freq='T')) + list(pd.date_range('2019-02-27', periods=1, freq='T'))
customers = ["c12987"]*5 + ["c89563"]*2 + ["c56733"]
articles = ["a8473", "a7631", "a1264", "a8473", "a5641", "a9813", "a7631", "a1132"]
action_type = ["viewed", "purchased", "viewed", "purchased", "viewed", "viewed", "purchased", "viewed"]
interaction_history = pd.DataFrame({'Customer_no': customers, 'Date': rng, 'Article_no': articles, "Interaction": action_type})
interaction_history
输出:
Customer_no Date Article_no Interaction
0 c12987 2019-02-24 00:00:00 a8473 viewed
1 c12987 2019-02-24 00:01:00 a7631 purchased
2 c12987 2019-02-24 00:02:00 a1264 viewed
3 c12987 2019-02-24 00:03:00 a8473 purchased
4 c12987 2019-02-24 00:04:00 a5641 viewed
5 c89563 2019-03-13 00:00:00 a9813 viewed
6 c89563 2019-03-13 00:01:00 a7631 purchased
7 c56733 2019-02-27 00:00:00 a1132 viewed
我想为每个客户和行查看以前的文章以及购买的以前的文章。
预期输出:
Customer_no Date Article_no Interaction Prev_viewed Prev_purchased
0 c12987 2019-02-24 00:00:00 a8473 viewed [] []
1 c12987 2019-02-24 00:01:00 a7631 purchased [a8473] []
2 c12987 2019-02-24 00:02:00 a1264 viewed [a8473] [a7631]
3 c12987 2019-02-24 00:03:00 a8473 purchased [a8473, a1264] [a7631]
4 c12987 2019-02-24 00:04:00 a5641 viewed [a8473, a1264] [a7631, a8473]
5 c89563 2019-03-13 00:00:00 a9813 viewed [] []
6 c89563 2019-03-13 00:01:00 a7631 purchased [a9813] []
7 c56733 2019-02-27 00:00:00 a1132 viewed [] []
我意识到我可以使用interaction_history.apply(lambda x: my_custom_function(x), axis=1) 之类的自定义函数遍历每一行,其中my_custom_function(x) 将为每一行过滤整个interaction_history 以找到匹配的Customer_no、Interaction 和适当的日期。我也意识到这种解决方案效率低下且非常复杂,因此希望有人有其他想法!
【问题讨论】:
-
groupby 允许按每个 customer_no 组织文件。如果 customer_no 对于每个人都是唯一的,您可以轻松地对每个客户执行操作以确定交易历史
标签: python python-3.x pandas numpy pandas-groupby