计算老客户

时间:2019-09-06 13:42:52

标签: python pandas dataframe

我正在分析一家商店的销售数据,并希望计算下个月成为经常性客户的“第一订单客户”的比例。

我有一个带有所有订单的DataFrame。这包括客户ID,日期和标志(如果这是他/她的第一笔订单)。这是我的数据:

import pandas as pd 

data = {'Name': ['Tom', 'nick', 'krish', 'Tom'], 
        'First_order': [1, 1, 1, 0], 
        'Date' :['01-01-2018', '01-01-2018', '01-01-2018', '02-02-2018']} 

df = pd.DataFrame(data) 

我现在将在1月创建所有新客户的列表,并在2月创建所有旧客户的列表,并进行内部加入。然后我有两个可以计算百分比的数字。

但是我不知道如何在不循环数据框架的情况下计算整整一年的滚动。有没有一种不错的pandas / python方法呢?

目标是创建一个新的数据框,其中包含月份以及上个月的老客户百分比。

1 个答案:

答案 0 :(得分:1)

一个想法是将所有订单从1月到11月,并在“重复发生”列中根据该客户在下个月订购的情况给出对/错。然后,您可以按每月分组的方式,对真/假计数/总和进行计数,并添加一列以给出比率。

编辑:在此之前,您可能需要转换日期:

<!--child component-->
<form>
<ng-select></ng-select>
</form>

然后:

df.Date = pd.to_datetime(df.Date)

在这一点上,对于每个月,“名称”列具有第一笔订单的数量,“重复”列具有下个月再次订购的数量。一个简单的额外列为您提供百分比:

df['month'] = df['Date'].apply(lambda x: x.month) #this is for simplicity's sake, not hard to extend to MMYYYY
df1 = df[df.month != 12].copy() #now we select everything but Nov
df1 = df1[df1.First_order == 1].copy() #and filter out non-first orders
df1['recurr'] = df1.apply(lambda x: True if len(df[(df.month == x.month + 1)&(df.Name == x.Name)])>0 else False, axis=1) #Now we fill a column with True if it finds an order from the same person next month
df2 = df1[['month','Name','recurr']].groupby('month').agg({'Name':'count','recurr':'sum'})

编辑:对于任意多个日期,这都是一个笨拙的解决方案。选择开始日期,并将该年的1月作为第1个月,然后在其后的所有月份中依次编号。

df2['percentage_of_recurring_customer'] = (df2.recurr/df2.Name)*100

现在我们有了一个转换日期的函数,代码稍有变化:

df.Date = pd.to_datetime(df.Date)
start_year = df.Date.min().year
def get_month_num(date):
    return (date.year-start_year)*12+date.month

最后,您可以创建一个将月份数字恢复为日期的功能:

df['month'] = df['Date'].apply(lambda x: get_month_num(x))
df1 = df[df.First_order == 1].copy()
df1['recurr'] = df1.apply(lambda x: True if len(df[(df.month == x.month + 1)&(df.Name == x.Name)])>0 else False, axis=1)
df2 = df1[['month','Name','recurr']].groupby('month').agg({'Name':'count','recurr':'sum'})