索引层级内聚合:按月度群组计算营收总和与用户总数
解决方法:按群组(Cohort)汇总终身收入与用户总数
嘿,我来帮你搞定这个需求!你想要把带层级索引的分组结果,转换成每个群组对应终身收入总和和用户总数的常规数据表对吧?其实不用绕弯路,直接从原始数据或者现有分组结果都能实现,下面给你两种方案:
方案1:直接从原始DataFrame处理(推荐)
你的原始数据dfsort应该是每条记录对应一个用户的相关数据,所以我们直接按Cohort分组,同时聚合两个指标就好,代码简洁又高效:
import pandas as pd # 按Cohort分组,计算两个核心指标 cohort_summary = dfsort.groupby('Cohort').agg( # 计算该群组的终身收入总和 Total_Lifetime_Revenue=('Lifetime_Revenue', 'sum'), # 计算该群组的唯一用户总数 Total_Customers=('Customer_ID', pd.Series.nunique) ).reset_index()
预期输出示例:
| Cohort | Total_Lifetime_Revenue | Total_Customers |
|---|---|---|
| 2014-01 | 149.9 | 1 |
| 2014-02 | 299.9 | 1 |
| 2014-03 | 1499.68 | 3 |
| 2014-04 | 1649.72 | 3 |
| ... | ... | ... |
这里reset_index()的作用是把Cohort从索引列变回普通列,得到标准的二维数据表格式。
方案2:从你已有的分组结果cohorts处理
如果你已经有了按Cohort和Lifetime_Revenue分组后的cohorts数据,也可以基于它进一步汇总:
# 从现有分组数据计算群组汇总 cohort_summary = cohorts.groupby('Cohort').agg( # 每个收入值乘以对应用户数,再求和得到总终身收入 Total_Lifetime_Revenue=lambda x: (x.get_level_values('Lifetime_Revenue') * x['Customer_ID']).sum(), # 把该群组下所有用户数相加得到总用户数 Total_Customers=('Customer_ID', 'sum') ).reset_index()
这个方案是因为你的cohorts里,每一行是某个群组下对应某一收入值的用户数,所以总终身收入需要用「收入值×用户数」再累加,总用户数则是该群组下所有用户数的总和。
两种方案都能得到你想要的常规数据表,优先推荐方案1,直接从原始数据处理更直观,也避免了中间步骤的冗余~
内容的提问来源于stack exchange,提问作者Kbbm
相关产品推荐
相关产品推荐

