如何用groupby按周一至周日的周计算用户平均周消费?
如何为所有客户统一定义周一至周日的周来计算平均消费?
我来帮你搞定这个问题!你遇到的核心问题是resample('7D')是基于每个用户的首笔消费日期生成连续7天周期,而不是使用统一的周一至周日自然周,所以结果不符合预期。下面是具体的解决方法:
核心思路
我们需要用pd.Grouper来指定统一的周分组规则,强制所有用户使用周一作为周起始、周日作为周结束的自然周,而不是各自的消费起始日。
完整可运行代码
import pandas as pd # 先还原你的原始数据 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() # 关键计算步骤 # 1. 按用户+周一起始的周分组,计算每周消费均值 weekly_grouped = df3.groupby( ['user', pd.Grouper(key='date', freq='W-MON')] # W-MON代表周以周一为起点 )['purchase'].mean() # 2. 对每个用户的所有周均值再取平均,得到最终结果 average_weekly = weekly_grouped.groupby('user').mean().reset_index(name='average_weekly_spend') print(average_weekly)
代码细节解释
pd.Grouper(key='date', freq='W-MON'):这是解决问题的关键!W-MON是pandas的频率标识,明确指定周的起始是周一,结束是周日。这样不管每个用户的首笔消费日期是什么,都会被划分到统一的自然周里。- 第一步分组计算的是每个用户每周的平均消费,第二步再对这些周均值取整体平均,就得到了你想要的“平均每周消费”。
结果验证
运行这段代码后,你会得到符合预期的统一周计算结果,再也不会出现不同用户周起始不一致的问题啦。
内容的提问来源于stack exchange,提问作者SCool
相关产品推荐
相关产品推荐

