gpt4 book ai didi

python - 使用 pandas 寻找 90 天前的现有客户

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:16 24 4
gpt4 key购买 nike

尝试在数据框中建立新客户与现有客户,“现有”意味着他们在订单日期前 90 天以上就存在于数据框中。试图找到最佳的 pandas 方法来做到这一点 - 目前我'm masking based on the date 然后查看系列:

from datetime import datetime, timedelta


def is_existing(row):
mask = (df_only_90_days['placed_at'] <= (row['placed_at'] + timedelta(-1)).date())
return row['customer_id'] in df_only_90_days.loc[mask]['customer_id']


df_only_90_days.apply(is_existing, axis=1)

几千条记录没问题,但一旦我进入数百万条记录,它就太慢了。抱歉, Pandas 也是新手。有什么想法吗?

最佳答案

您可以使用 Pandas groupby基于 customer_id 的功能,然后您可以独立查看每个组。

假设您的数据框如下所示:

   customer_id                  placed_at
0 1 2016-11-17 19:16:35.635774
1 2 2016-11-17 19:16:35.635774
2 3 2016-11-17 19:16:35.635774
3 4 2016-11-17 19:16:35.635774
4 5 2016-11-17 19:16:35.635774
5 5 2016-07-07 00:00:00.000000

客户 5 存在于 90 天前。但是其他顾客都没有。使用 groupby 我们可以创建一个 groupby 对象,其中每个组包含具有特定 customer_id 的所有行。我们为您的数据框中的每个唯一 customer_id 获取一组。当我们将函数应用于此 groupby 对象时,它将应用于每个组。

 groups = df.groupby("customer_id")

然后我们可以定义一个函数来检查给定的组以查看该客户在 90 天前是否存在。

 def existedBefore(g):
# if the difference between the max and min placed_at values is less than 90 days
# then return False. Otherwise, return True
# if the group only has 1 row, then max and min are the same
# so this check still works
if g.placed_at.max() - g.placed_at.min() >= datetime.timedelta(90):
return True

return False

现在如果我们运行:

groups.apply(existedBefore)

我们得到:

customer_id
1 False
2 False
3 False
4 False
5 True

因此我们可以看到客户 5 之前存在。

此解决方案的性能将取决于您拥有多少独特的客户。请参阅此链接以更深入地了解 groupbyapply 性能:Pandas groupby apply performing slow

矢量化解决方案

如果您只想查找在今天之前至少 90 天注册的所有用户,那么您可以采用矢量化方法,而不是依赖于apply

 import datetime
priors = df[datetime.datetime.now() - df.placed_at >= timedelta(90)]

priors 将如下所示:

   customer_id  placed_at
5 5 2016-07-07

所以我们看到客户 5 在今天之前 90 天就存在了。您最初的解决方案与此非常接近,问题是 apply 对于大型数据帧来说速度很慢。 There are ways to improve that performance但这种矢量化方法应该可以满足您的需求。

关于python - 使用 pandas 寻找 90 天前的现有客户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com