pandas 如何找到30天内第二次购买的客户?

baubqpgj  于 2023-10-14  发布在  其他
关注(0)|答案(3)|浏览(108)

我需要你的快速帮助。我想为那些在第一次购买后30天内进行了第二次购买的客户查找customer_id和first purchase_date的列表。
即,customer_id的1、2、3在30天内进行了第二次购买。
我需要customer_id的1,2,3和它们各自的首次购买日期。
我有超过10万个客户ID。

我如何在Pandas身上实现这一点?

mbjcgjjk

mbjcgjjk1#

您可以设置一个布尔掩码来过滤30天内第二次购买的客户组,如下所示:

# Pre-processing to sort the data and convert date to the required date format
df = df.sort_values(['Customer_id', 'purchase_date'])
df['purchase_date'] = pd.to_datetime(df['purchase_date'])

# Set boolean mask
mask = (((df['purchase_date'] - df['purchase_date'].groupby(df['Customer_id']).shift()).dt.days <= 30)
            .groupby(df['Customer_id'])
            .transform('any')
       )

那么,我们已经可以通过以下代码过滤30天内第二次购买的客户的交易记录:

df[mask]

要进一步显示customer_id及其各自的首次购买日期,您可以使用:用途:

df[mask].groupby('Customer_id', as_index=False).first()
jjjwad0x

jjjwad0x2#

你可以用groupby来做

s = df.groupby('Customer_id')['purchase_date'].apply(lambda x : (x.iloc[1]-x.iloc[0]).days<30)
out = df.loc[df.Customer_id.isin(s.index[s])].drop_duplicates('Customer_id')
uurity8g

uurity8g3#

这里有一个方法:

df2 = (df.loc[df['purchase_date']
              .lt(df['Customer_id']
                  .map((df.sort_values('purchase_date').groupby('Customer_id').first() + pd.to_timedelta(30,'d'))
                       .squeeze()))])

df2 = (df2.loc[df2.duplicated('Customer_id',keep=False)]
       .groupby('Customer_id').first())

df = df.sort_values('purchase_date')
m = df.assign(c1 = 1).groupby('Customer_id').rolling('30D',on = 'purchase_date')['c1'].sum().gt(1).groupby(level=0).any()
df.loc[~df.duplicated('Customer_id',keep='first') & df['Customer_id'].map(m)].sort_index()

p = 'purchase_date'
c = 'Customer_id'
(df.loc[df[p].le(df.groupby(c)[p].transform('min') + pd.to_timedelta('30D'))
    .groupby(df[c])
    .transform('sum')
    .gt(1)]
    .groupby(c)[p]
    .min())

输出量:

Customer_id
1   2018-07-13
2   2018-06-16
3   2018-07-14

相关问题