如何使用 groupby 计算平均每周支出,每周是周一到周日?

SCo*_*ool 2 python pandas

我有一个包含购买金额和日期的客户数据框。在这种情况下,我有两个客户,A并且B

df1 = pd.DataFrame(index=pd.date_range('2015-04-24', periods = 50)).assign(purchase=[x for x in range(51,101)])
df2 = pd.DataFrame(index=pd.date_range('2015-04-28', periods = 50)).assign(purchase=[x for x in range(0,50)])

df3 = pd.concat([df1,df2], keys=['A','B'])

df3 = df3.rename_axis(['user','date']).reset_index()
print(df3.head())

  user       date  purchase
0    A 2015-04-24        51
1    A 2015-04-25        52
2    A 2015-04-26        53
3    A 2015-04-27        54
4    A 2015-04-28        55
Run Code Online (Sandbox Code Playgroud)

我只想知道用户的平均每周支出,一周是从周一到周日。预期结果:

  user       average_weekly_spend 
0    A       51
1    B       60
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何将其设置为周一至周日。现在我正在使用resample7D. 我认为,这意味着所有客户对一周都有不同的定义。我相信从第一次购买开始需要 7 天,依此类推。因此,每个客户都有不同的开始日期。

df3.groupby('user').apply(lambda x: x.resample('7D', on='date').mean()).groupby('user')['purchase'].mean()


user
A    78.125
B    27.125
Run Code Online (Sandbox Code Playgroud)

对于所有客户,是否可以将我自己的一周定义为周一至周日?

jez*_*ael 5

看来你需要W-Mon频率:

df = (df3.groupby('user')
         .resample('W-Mon', on='date')['purchase']
         .mean()
         .mean(level=0)
         .reset_index())
print (df)
  user  purchase
0    A      75.5
1    B      28.7
Run Code Online (Sandbox Code Playgroud)

不知道这里是很好的解决方案使用meanmeanS,也许你可以得到数与重采样的款项,然后创建定义的手段-通过总和除以计数:

df = (df3.groupby('user')
         .resample('W-Mon', on='date')['purchase']
         .agg(['size','sum'])
         .sum(level=0))
df['mean'] = df.pop('sum') / df.pop('size')
print (df)
      mean
user      
A     75.5
B     24.5
Run Code Online (Sandbox Code Playgroud)