You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按不同列存储的复合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:01:37