如何按不同列存储的复合cohort对DataFrame进行分组?
按所有参数组合分组DataFrame并计算指标的方法
嘿,这个需求在pandas里处理起来其实特别直观!我给你分两种常见场景来解释,保证你一看就会~
基础场景:只统计有数据的Cohort
如果你的需求是只针对原始数据中存在的参数组合(也就是有记录的cohort)计算指标,直接用groupby传入所有参数列的列表就行,pandas会自动识别所有唯一的组合。
示例代码
先构造一个和你描述匹配的示例DataFrame:
import pandas as pd data = { 'animal': ['duck', 'cat', 'dog', 'duck', 'cat'], 'color': ['white', 'grey', 'black', 'grey', 'black'], 'size': ['small', 'big', 'small', 'big', 'big'], 'value': [10, 20, 15, 25, 30] # 用来计算指标的数值列 } df = pd.DataFrame(data)
然后执行分组和指标计算:
# 按animal、color、size三列分组,计算value的总和 cohort_metrics = df.groupby(['animal', 'color', 'size'])['value'].sum().reset_index() print(cohort_metrics)
结果说明
这段代码会输出所有存在数据的cohort及其对应的指标值。reset_index()是把分组后的多级索引转成普通列,让结果更易读。你也可以把sum()换成其他统计函数,比如mean()(均值)、count()(计数)等等,完全根据你的指标需求调整。
进阶场景:包含所有理论上的Cohort(即使无数据)
如果你的需求是必须覆盖所有可能的参数组合(哪怕某个组合在原始数据里没有记录,也要显示出来,指标值填0或NaN),那需要先生成所有参数的笛卡尔积,再和分组结果对齐。
示例代码
# 定义所有可能的参数选项 all_animals = ['duck', 'cat', 'dog'] all_colors = ['white', 'grey', 'black'] all_sizes = ['small', 'big'] # 生成所有可能的cohort组合(笛卡尔积) all_cohorts = pd.MultiIndex.from_product( [all_animals, all_colors, all_sizes], names=['animal', 'color', 'size'] ) # 先做基础分组,再重新索引到全组合,缺失值填充为0 cohort_metrics_full = df.groupby(['animal', 'color', 'size'])['value'].sum() \ .reindex(all_cohorts, fill_value=0) \ .reset_index() print(cohort_metrics_full)
结果说明
pd.MultiIndex.from_product()会生成所有参数的全部组合,之后用reindex()把分组结果对齐到这个全组合,缺失的组合会自动填充你指定的值(这里是0,如果你想保留NaN可以去掉fill_value=0)。这样就能得到完整的所有cohort的指标统计了。
内容的提问来源于stack exchange,提问作者Versteher
相关产品推荐
相关产品推荐

