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

如何按不同列存储的复合分组(cohort)对DataFrame分组?

按多列参数所有可能组合分组计算指标的实现方法

嘿,这个需求在Pandas里其实非常直观就能搞定!下面我分两种常见场景给你详细说明:

场景1:仅按数据中存在的组合分组

如果你只需要对原始数据里实际存在的参数组合进行分组计算,直接用groupby方法传入所有分组列的列表就可以了,非常简单。

举个具体的例子,假设你的DataFrame是这样的:

import pandas as pd

# 构造示例数据
data = {
    'animal': ['duck', 'cat', 'dog', 'duck', 'cat'],
    'color': ['white', 'grey', 'black', 'grey', 'black'],
    'size': ['small', 'big', 'small', 'big', 'small'],
    'value': [10, 20, 15, 25, 30]
}
df = pd.DataFrame(data)

要按animal、color、size三列的所有存在组合分组,计算value的均值和总和,代码可以这么写:

# 按多列分组,计算多个指标
grouped_results = df.groupby(['animal', 'color', 'size']).agg(
    mean_value=('value', 'mean'),
    total_value=('value', 'sum'),
    count=('value', 'count')
).reset_index()

print(grouped_results)

这样得到的结果里,只会包含原始数据中出现过的组合,比如small white duck、big grey cat这些实际有数据的分组。

场景2:强制包含所有理论上的参数组合(含无数据的分组)

如果你的需求是不管数据中有没有,都要显示所有可能的参数组合(比如没有数据的分组填充0或者NaN),那可以先通过pd.MultiIndex.from_product生成所有可能的组合,再和分组结果合并。

接上面的示例,先定义每列的所有可能取值:

# 定义各列的所有可能取值
all_animals = ['duck', 'cat', 'dog']
all_colors = ['white', 'grey', 'black']
all_sizes = ['small', 'big']

# 生成所有可能的组合索引
all_combinations = pd.MultiIndex.from_product(
    [all_animals, all_colors, all_sizes],
    names=['animal', 'color', 'size']
)

# 先按存在的组合分组计算
grouped = df.groupby(['animal', 'color', 'size'])['value'].sum()

# 重新索引,填充所有组合,缺失值填0
full_results = grouped.reindex(all_combinations, fill_value=0).reset_index()

print(full_results)

这样输出的结果里就会包含像big white dog这种原始数据中没有的组合,对应的value总和会是0(你也可以根据需求改成NaN或者其他值)。

补充小技巧

  • 如果分组列很多,不想手动列出来,可以直接用df.columns里的参数列子集,比如假设参数列是前3列,就写df.groupby(df.columns[:3])。
  • 分组后的结果默认是多级索引,用reset_index()可以把分组列变回普通列,方便后续处理。

内容的提问来源于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 07:56:15