Python 如何计算groupby每周的平均花费,每周为周一至周日?

Python 如何计算groupby每周的平均花费,每周为周一至周日?,python,pandas,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 ran

我有一个带有购买金额和日期的客户数据框。在这种情况下,我有两个客户,
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
我只想知道用户的平均每周花费,一周是从周一到周日。预期成果:

  user       average_weekly_spend 
0    A       51
1    B       60
但是我不知道如何将它设置为周一到周日。目前,我正在使用
重采样
7D
。我认为,这意味着所有客户对一周都有不同的定义。我相信从第一次购买开始需要7天,以此类推。因此,每个客户都有不同的开始日期

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


user
A    78.125
B    27.125

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

似乎您需要
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
不确定这里是否有好的解决方案使用
mean
mean
s,也许您可以通过重采样获得计数和总和,然后根据定义创建均值-总和除以计数:

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

有趣的是,另一个带有
to_period
的解决方案给出了不同的答案:

df3.groupby(['user',df3.date.dt.to_period('W-MON')]).mean().mean(level='user')
输出:

      purchase
user          
A       75.500
B       27.125

在Python中,日期范围已经被索引为周一到周日

如果您只是使用pandas.Series.dt.week方法来获取周数,这很容易

df3['week_number'] = df3['date'].dt.week
df3.head(20)
您可以查看上面的df3,第18周从2015-04-27开始,也就是周一

df4 = df3.groupby(['user','week_number']).mean()

# Final mean
df4.groupby(['user']).mean()
我认为这是正确的每周平均花费。然而,这与您在帖子中分享的预期结果并不相同

Output:

user    purchase
A   74.625
B   26.250

有趣的是,这里的三个答案都有不同的值。@SCool:只能是一个正确答案,但是:)在将原始数据框减少到30个条目(句点=15)后,我手工检查了数学,在我的代码中它加起来了。所以其他答案不可能是正确的。请你也检查一下你这边的情况,然后选择一个答案。我一开始工作就会检查一下,然后再给你回复。这里的三个答案给出了不同的值。隐马尔可夫模型!这里的每个人在答案中都有不同的答案值@史酷尔,我想是因为手段太卑鄙了。